2013-05-03 29 views
2

在骨幹模型中,是否可以在初始化函數中爲嵌套視圖觸發事件?我將這個例子的當前代碼作爲基礎:https://stackoverflow.com/a/8523075/2345124,並且已經爲主幹1.0.0更新了它。這裏是我的初始化函數,一個模型:初始化模型時是否可以觸發事件?

var Edit = Backbone.Model.extend({ 
    initialize: function() { 
     this.trigger('marquee:add'); 

     this.on('change', function(){ 
      this.trigger('marquee:add'); 
     }); 
    } 
    ... 
} 

我想打電話的時候,該模型被初始化的方法renderMarquee:

var EditRow = Backbone.View.extend({ 
    initialize: function() { 
     this.listenTo(this.model, "change", this.render); // works 
     this.listenTo(this.model, "marquee:add", this.renderMarquee); // only called when changed, but not when initially created 
    ... 
} 

renderMarquee IS當模型改變時調用,但不是在初始化時。 「更改」事件按預期工作(調用this.render)。有什麼想法嗎?

謝謝!

回答

0

這並沒有多大意義,因爲您在進行view.listenTo調用之前正在初始化模型。不幸的是,你在這件事上並沒有真正的選擇。

您可能要將事件處理移至Backbone.Collection,該處理器已經內置了可供您添加/刪除的監聽事件。

+0

哦 - 我明白你在說什麼 - 我知道這很簡單。我試着聽收集'添加'事件 - 但最終有一些意想不到的行爲。仔細觀察一下,看看發生了什麼(每當我向集合中添加模型時,集合中的每個模型都會調用「add」事件)。 – ururk 2013-05-03 03:36:16

1

我目前正面臨類似的問題。我需要在我的模型的初始化方法中觸發change事件。 我看着骨幹代碼顯露爲什麼這是不會發生:

var Model = Backbone.Model = function(attributes, options) { 
    ... 
    this.set(attrs, options); 
    this.changed = {}; 
    this.initialize.apply(this, arguments); 
    }; 

setinitializethis.change執行之前清空設置爲「什麼都沒有改變」的模式狀態。

爲了覆蓋行爲,我將下面的代碼添加到了我的初始化方法中。

initialize: function(attributes, options) { 
    ... 
    this.changed = attributes; 
    this.trigger('change'); 
    for (attr_name in attributes) { 
    this.trigger('change:' + attr_name); 
    } 
}, 

我手動觸發所有變化的事件,因爲繼承模型可以結合changechange:attrxy這對我來說很重要。但這還不夠,因爲如果我只是觸發事件,則changedAttributes()方法將返回false,因此我還將this.changed設置爲當前屬性。

相關問題