1

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

4

1 回答 1

3

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

但不要上当,这些仅"change"在触发事件时适用:

请注意,此方法以及以下与更改相关的方法仅在事件过程中有用"change"

所以在事件被触发和处理后它们就没有用了。

我认为您必须跟踪哪些模型已经改变了自己。您可以在集合本身上执行此操作而无需太多努力,因为

为方便起见,在集合中的模型上触发的任何事件也将直接在集合上触发。

并且集合可以绑定到它自己的事件。例如,您的收藏中可能有这样的东西:

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。

于 2012-04-19T03:13:40.837 回答