2012-10-24 90 views
2

在Backbone.js視圖中的一箇中,我使用this.model.set({ read: true });更新當前模型(消息實例)的屬性「read」。我證實這個命令只執行一次(我知道「鬼事件」)。正如你在下面看到的,我配置了Collection來激發一個更新事件,其中整個Collection被保存到一個變量中。 不幸的是saveToVar函數被調用3次而不是1次!此外,第一次saveToVar被調用,this正確包含所有的集合的模型,而第二次和第三次this只有一個模型,即我所做的更新。 我追蹤了一切,但我不知道爲什麼會發生這種情況。Backbone.js多次觸發集合更改事件

window.Message = Backbone.Model.extend({ 

}); 

window.MessageCollection = Backbone.Collection.extend({ 

model: Message, 

initialize: function() 
{ 
    this.on("change", this.saveToVar); 
}, 

saveToVar: function(e) 
{ 
    App.Data.Messages = this.toJSON(); 
    return; 
} 

}); 
+0

我將代碼粘貼到jsfiddle.net,但由於某種原因,我無法運行它?實際上從未使用過。 [link](http://jsfiddle.net/hvXbn/3/) – hofimax

+0

我也挖得更深一點,似乎'saveToVar:function(model){App.Data.Messages = model.collection.toJSON(); ''是一項工作。也許這個集合中的this是指模型? – hofimax

+0

但在這裏再次,事件被解僱3次! – hofimax

回答

7

在你的jsfiddle,你這樣做是:

App.Collections.message = new MessageCollection([ ... ]); 
var elements = App.Collections.message.where({ id: 4 }); 
var item = new MessageCollection(elements); 

where調用將返回模型是message集合中,這些模型沒有副本,但究竟是相同的模型對象在message。現在你有兩個參考你的id: 4模型:

  1. 原來的一個埋在裏面App.Collections.message
  2. elements[0]中的一個。

這兩個引用都指向同一個對象。然後您將elements添加到另一個MessageCollection。現在,你有這樣的事情:

App.Collections.message.models[3] item.models[0] 
           |     | 
           +--> [{id: 4}] <--+ 

無論這些集合將有關在id: 4模型更改事件通知,因爲collections listen to all events on their members

被觸發集合模型中的任何事件也會直接在集合上觸發,方便起見。

而且您的收藏偵聽"change"事件本身:

initialize: function() 
{ 
    this.on("change", this.saveToVar); 
} 

所以,當你這樣做:

this.model.set({ read: true }); 
在你看來

,兼具收藏將被通知,因爲這種模式恰好在兩個集合中。

如果我們改變你的事件處理程序是這樣的:

saveToVar: function() { 
    console.log(_(this.models).pluck('cid')); 
} 

,那麼你會看到同樣的cid(一個獨特之處在於骨幹產生標識符)出現在兩個集合。您也可以爲每個集合添加一個隨機數並查看您獲得的數字saveToVarhttp://jsfiddle.net/ambiguous/mJvJJ/1/

您可能不應該在兩個集合中擁有一個模型。在創建item之前,你可能不應該有相同模型的兩個副本在克隆elements[0]附近踢,也可能不是一個好主意。您可能需要重新考慮您的架構。

+0

感謝您的幫助!我可以看到.where()複製模型,而.get()實際上只是一個引用。有沒有一種方法可以使用.where()來僅獲得集合中模型子集的引用? – hofimax

+0

@hofimax:你可以得到一個數組,但不是另一個集合。 –