Это функция сброса магистрали:
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 строки, потому что вы не предоставляете никаких моделей для функции сброса. Также давайте проигнорируем первые 2 строки. Итак, сначала мы перебираем модели в этой коллекции и вызываем метод коллекции _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 = {};
},
Он просто полностью удаляет любые ссылки на любые модели, которые когда-либо были в коллекции.
Что мы можем сделать из этого? Что ж, функция сбора reset
в 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;
}
});
Надеюсь это поможет!
person
jakee
schedule
02.08.2012