如何从集合中获取自构建后已更改的模型列表

时间:2012-04-19 01:56:54

标签: backbone.js backbone.js-collections

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

1 个答案:

答案 0 :(得分:3)

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

但不要被愚弄,这些仅在触发"change"事件时适用:

  

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()来获取已更改的模型。您还希望监听其他事件,以便在删除模型或与服务器同步时更新this.delta;以上只是为了说明。如果您不想返回Underscore对象,则可以使用此代码:

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。