2012-04-19 40 views
1

如果在初始化dialogview时使用模型属性的对象数组初始化集合。然后,允许用户编辑列表的对话框视图通过调用模型集来更新这些模型值。当单击对话框的OK按钮时,backbone是否提供了一种方法来获取自从创建/初始化集合以来仅更改了那些模型的列表?如何获得集合中建模后发生更改的模型列表

回答

3

有看起来诱人的各种模型方法:

但是,不要被愚弄,那些只适用而"change"事件正在tr iggered:

Note that this method, and the following change-related ones, are only useful during the course of a "change" event.

所以他们没用在事件发生后已被触发和处理。

我认为你必须跟踪哪些模型已经改变了你自己。你可以自

Any event that is triggered on a model in a collection will also be triggered on the collection directly, for convenience.

集合本身做这个没有太多精力和收集可以绑定到其自己的事件。例如,你可以有这样的事情在您的收藏:

Backbone.Collection.extend({ 
    initialize: function() { 
     this.delta = { }; 
     this.on('change',​​​​​ this._a_model_has_changed); 
    }, 
    changed_models: function() { 
     return _.chain(this.delta).values(); 
    }, 
    _a_model_has_changed: function(m) { 
     this.delta[m.id] = m; 
    } 
}); 

然后,你可以得到那些通过调用collection.changed_models()改变的车型。您还希望监听其他事件,以便在模型被删除或与服务器同步时更新此.delta;以上仅供说明。如果你不想一个下划线对象返回你也可以使用这样的:

changed_models: function() { 
    return _(this.delta).values(); 
} 

但能够collection.changed_models().each(function() { ... })方便。

演示:http://jsfiddle.net/ambiguous/8PQh9/

你也可以让模型通过对模型的一组类似的追踪自己的肮脏。然后,你可以做这样的事情:

collection.filter(function(m) { return m.is_dirty() }); 

其中,当然,is_dirty假若该模型已经改变返回true。

相关问题