Backbone.js:在Collection中使用时不会触发模型事件

时间:2012-05-06 05:20:02

标签: javascript backbone.js javascript-framework backbone-events backbone-views

这里我有一个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基于模型的“id”。

1 个答案:

答案 0 :(得分:2)

对集合执行fetch时:

  

该集合将重置

that will

  

使用新的模型列表(或属性哈希)替换集合,最后触发单个"reset"事件。 [...]使用不带参数的reset非常适合清空集合。

因此,集合上的fetch将删除当前集合中的所有模型,并将其替换为全新的模型实例。不会发生"change"个事件,只会发生一个"reset"个事件。

在模型上执行fetch时:

  

如果服务器的状态与当前属性不同,将触发"change"事件。

因此,调用fetch几乎与从服务器手动加载数据并调用set来更改模型一样。


摘要Collection#fetch不会触发任何"change"个事件,只会触发"reset"个事件;如果发生变化,Model#fetch会触发"change"事件。


如果您只想在创建新模型实例时添加一些新属性,则可以使用Model#parse向传入的JSON添加新属性。