這是骨幹復位功能:
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條線路,因爲你不提供任何模型復位功能。還讓我們忽略前兩行。通過這個集合中的模型所以我們首先循環,並呼籲集合的_removeReference(model)
方法,它看起來像這樣:
_removeReference: function(model) {
if (this == model.collection) {
delete model.collection;
}
model.off('all', this._onModelEvent, this);
},
這裏會發生什麼事是,我們乾脆也去除模型對象的集合,屬性中刪除綁定到這個模型的事件。接下來,我們稱之爲集合的_reset()
功能全,看起來像這樣:
_reset: function(options) {
this.length = 0;
this.models = [];
this._byId = {};
this._byCid = {};
},
它只是徹底消除了收集有過任何車型任何引用。
我們能做些什麼?那麼在Backbone中的功能集合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;
}
});
希望這有助於!
夠公平的,如果這使得它更清晰,謝謝rimian – nimrod 2012-08-02 12:04:23