0

在這裏,我有一個Backbone.js模型 - 聯繫人和一個集合 - 聯繫人作爲模型。我有兩個視圖,其中一個我使用collection來列出所有聯繫人,另一個模型直接顯示一個聯繫人。但是,當我直接使用模型時,我能夠在使用集合中的'change'事件時觸發'change'事件(即使模型中的'all'事件)也未被觸發。我是否在這裏錯過了一些額外的綁定,以使它與集合一起工作?Backbone.js:模型事件在集合中使用時未被觸發

var Contact = Backbone.Model.extend({ 
    defaults: { 
     id: 0, 
     urlDisplayPicBig: '', 
     urlDisplayPicSmall: '' 
    }, 
    initialize: function() { 
     this.bind('change', this.doSomething); 
    }, 
    generateUrls: function() { //earlier doSomething() 
     ... 
    } 
    ... 
}); 

var Contacts = Backbone.Collection.extend({ 
    model: Contact, 
    ... 
}); 

更新 在使用我要跑generateUrls都收集&單一模型實例()基於該模型的「身份證」更新urlDisplayPicBig & urlDisplayPicSmall。

+2

適用於我(http://jsfiddle.net/ambiguous/xUSLE/),你在做什麼不同? –

+0

我認爲最主要的區別是代替add()我使用fetch從服務器獲取JSON。但是,fetch()在模型和集合中的表現有所不同嗎? – Saneef

+0

['Collection#fetch'](http://documentcloud.github.com/backbone/#Collection-fetch)將創建新的模型實例,將現有模型從集合中移除,因此沒有更改事件; ['型號#fetch'](HTTP://documentcloud.github。com/backbone /#Model-fetch)就地更改模型並確實觸發更改事件。你在集合上調用'fetch'? –

回答

2

當你向一個做fetch

集合將重置

that will

與型號的新列表替換集合(或屬性散列) ,最後觸發一個單一的"reset"事件。 [...]使用不帶參數的reset可以用來清空集合。

因此集合上的fetch將刪除當前集合中的所有模型,並將其替換爲全新的模型實例。沒有"change"事件發生,只會有一個單一的"reset"事件。

當你做一個模型fetch:如果服務器的狀態下,從當前屬性不同

一個"change"事件將被觸發。

所以調用fetch與從服務器手動加載數據幾乎是一樣的,並調用set來更改模型。


摘要Collection#fetch不會觸發任何"change"事件,只是一個"reset"事件;如果事情發生變化,Model#fetch將觸發"change"事件。


如果你只是想增加一些新型的屬性創建新模型實例時,那麼你可以添加新的屬性使用Model#parse傳入的JSON。

+0

感謝您的澄清。所以我假設沒有辦法在模型中獲取集合#獲取的'重置'事件。 :( – Saneef

+0

@Saneef:並非如此,這些模型無法在重置事件中保留下來,您是否可以更新您的問題以包含一些關於doSomething需要做什麼的信息?可能有更好的辦法。 –

+0

我已經更新了這個問題希望我對事件問題的意圖現在更加清晰 – Saneef