这是主干重置功能:
reset: function(models, options) {
models || (models = []);
options || (options = {});
for (var i = 0, l = this.models.length; i < l; i++) {
this._removeReference(this.models[i]);
}
this._reset();
this.add(models, _.extend({silent: true}, options));
if (!options.silent) this.trigger('reset', this, options);
return this;
},
我们可以忽略最后 3 行,因为您没有为 reset-function 提供任何模型。也让我们忽略前两行。所以首先我们遍历这个集合中的模型并调用集合的_removeReference(model)
方法,它看起来像这样:
_removeReference: function(model) {
if (this == model.collection) {
delete model.collection;
}
model.off('all', this._onModelEvent, this);
},
这里发生的情况是,我们从模型对象中完全删除了集合属性,并且还删除了与该模型事件的绑定。接下来我们调用集合的_reset()
-function,如下所示:
_reset: function(options) {
this.length = 0;
this.models = [];
this._byId = {};
this._byCid = {};
},
它只是彻底删除了对该系列曾经拥有的任何模型的任何引用。
我们能从中得到什么?好吧,Backbone 中的 collectionreset
功能基本上只是绕过了所有删除模型的官方渠道,并且完全保密,除了reset
被解雇之外没有其他事件。所以你想remove
在重置期间为从集合中删除的每个模型触发模型事件?简单的!只需像这样覆盖 Backbone.Collection 的重置功能:
var Collection = Backbone.Collection.extend({
reset: function(models, options) {
models || (models = []);
options || (options = {});
for (var i = 0, l = this.models.length; i < l; i++) {
this._removeReference(this.models[i]);
// trigger the remove event for the model manually
this.models[i].trigger('remove', this.models[i], this);
}
this._reset();
this.add(models, _.extend({silent: true}, options));
if (!options.silent) this.trigger('reset', this, options);
return this;
}
});
希望这可以帮助!