Backbone: запуск события только один раз в коллекции "change"
Простой вопрос: как лучше всего запустить событие "только один раз"?
У меня есть коллекция в магистрали с несколькими моделями. Иногда атрибуты нескольких моделей обновляются одновременно, вызывая несколько событий "изменения" в Коллекции.
Каков наилучший способ вызвать событие "change" только один раз, сгруппировав все изменения атрибутов вместе?
Моя лучшая идея на данный момент - использовать таймер, но он будет фиксировать только первое изменение атрибута модели.
Все предложения, идеи и решения ценятся. Спасибо:).
Контекст: в этом случае событие запускает очень вычислительную функцию, поэтому следует избегать многократных запусков.
3 ответа
Всякий раз, когда вы обновляете атрибуты на моделях оптом, передайте {silent:true}
как вариант, который will suppress any events from being fired.
Затем инициируйте пользовательское событие, для которого представление или несколько представлений прослушивают одно и то же.
Вы можете "отменить" метод в вашей коллекции, который отвечает на события изменения, хотя вам придется вручную выяснить, какие модели изменились:
Col = Backbone.Collection.extend({
modelChanged: _.debounce(function() {
// handle model changes
}, delayInMs),
initialize: function() {
this.collection.on('change', this.modelChanged, this);
}
})
Вы можете попробовать сбросить коллекцию, а не добавлять элементы. См. Описание метода сброса коллекции:
сброс
collection.reset([models], [options])
Добавление и удаление моделей по одной - это хорошо, но иногда у вас есть так много моделей, которые вы можете изменить, и вам лучше просто обновить коллекцию в большом количестве. Используйте reset, чтобы заменить коллекцию новым списком моделей (или хэшей атрибутов), вызывая одно событие "reset" в конце. Возвращает недавно установленные модели. Для удобства в событии "сброс" список всех предыдущих моделей доступен в виде options.previousModels.
Как сказано в документации, если вы используете reset
, вместо add
вы получите один reset
событие в конце.