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 событие в конце.

Другие вопросы по тегам