#backbone.js
#backbone.js
Вопрос:
Я читал в документации backbone, что вызов collection.reset()
очищает коллекцию. Я хочу знать, удаляет ли он также модели или они продолжают жить в памяти?
Если они не удалены, есть ли более простой способ удалить все модели в коллекции без перебора моделей и вызова model.remove()
?
Ответ №1:
Вы можете прослушать reset
событие из модели и выполнить очистку и this.destroy()
в ответ. Для этого и предназначены перехватчики событий. См http://backbonejs.org/#Events-catalog
Примечание: вы абсолютно не должны изменять или переопределять какой-либо метод или свойство с префиксом подчеркивания, например _removeReference
. Подчеркивания означают, что он предназначен как внутренний метод или свойство, и что внутренние реализации могут измениться (их API считаются нестабильными). Обновление Backbone может привести к поломке любого кода, который использует методы с префиксом подчеркивания, даже если релиз рекламируется как изменение, совместимое с обратной связью.
Я знаю, что в вашем вопросе говорится «без итерации», но это действительно самый надежный способ справиться с этим. Рассмотрим случай, когда модель была перемещена из одной коллекции в другую, но она все еще прослушивает reset
событие первой коллекции (потому что программист шесть месяцев спустя не заметил соединения).
Теперь, когда первая коллекция сбрасывается, перемещенная модель уничтожается. Упс!
Перебор коллекции, вероятно, является лучшим способом справиться с этим, если у вас нет конечной точки в вашем API, которая удалит все объекты в коллекции в пакетном режиме на сервере API (как это часто делается).
К счастью, эта итерация довольно проста:
destroyAll: function () {
var promises = [];
while(this.models.length > 0) {
promises.push( this.models[0].destroy() );
}
// handle errors communicating with the server
$.when(promises).fail(function (response) {
this.trigger('syncError',
response);
}.bind(this));
}
Ответ №2:
Вероятно, то, что вы ищете, — это сбор мусора для моделей. То есть, после того, как они будут удалены из коллекции, никто больше не будет ссылаться на эти модели.
Магистраль выполняет свою часть удаления ссылок, которые она устанавливает для моделей, когда они удаляются из коллекции. Однако вам необходимо выполнить собственную очистку, если в вашем коде есть ссылки на эти модели. В большинстве случаев это происходит, если эти модели зарегистрированы как прослушиватели событий, как в этом примере: http://jsfiddle.net/dira/4uxp4/2 /
Взглянув на реализацию reset
, вы могли бы изменить _removeReference
вызов функции очистки и для модели. И в модели удалите модель из всех прослушивателей / всех других объектов, которые содержат ссылку на нее.
Комментарии:
1. Не переопределяйте и не изменяйте методы или свойства с префиксом подчеркивания. Смотрите Мой ответ ниже для объяснения.