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