Магистраль: запуск события только один раз при «изменении» коллекции

Простой вопрос: Как лучше запустить событие "только один раз"?

У меня есть коллекция в магистрали с несколькими моделями. Иногда атрибуты нескольких моделей обновляются одновременно, вызывая несколько событий «изменения» в коллекции.

Каков наилучший способ запустить событие «изменение» только один раз, сгруппировав все изменения атрибутов вместе?

На данный момент моей лучшей идеей является использование таймера, но он будет фиксировать только первое изменение атрибута модели.

Все предложения, идеи и решения ценятся. Спасибо :).


Контекст: в этом случае событие запускает очень ресурсоемкую функцию, поэтому следует избегать множественных запусков.


person Dan0    schedule 09.08.2013    source источник


Ответы (3)


Всякий раз, когда вы массово обновляете атрибуты моделей, передайте {silent:true} в качестве опции, которая will suppress any events from being fired.

Затем запустите настраиваемое событие, для которого представление или несколько представлений прослушивают одно и то же.

person Sushanth --    schedule 09.08.2013
comment
Это скорее обходной путь, а не правильное решение. Лучшим решением было бы использовать reset вместо add. Будет вызвано одно событие reset. - person Maksim Sorokin; 05.01.2014

Вы можете «обнулить» метод в своей коллекции, который отвечает на события изменения, хотя вам придется вручную выяснить, какие модели изменились:

Col = Backbone.Collection.extend({
    modelChanged: _.debounce(function() {
        // handle model changes
    }, delayInMs),
    initialize: function() {
        this.collection.on('change', this.modelChanged, this);
    } 
})
person Stephen Thomas    schedule 09.08.2013

Вы можете попробовать сбросить коллекцию, а не добавлять элементы. См. описание метода сброса коллекции:

сбросить collection.reset([models], [options])

Добавление и удаление моделей по одной — это хорошо, но иногда у вас так много моделей для изменения, что вы предпочитаете просто обновлять коллекцию сразу. Используйте reset, чтобы заменить коллекцию новым списком моделей (или хэшей атрибутов), вызывая одно событие сброса в конце. Возвращает вновь установленные модели. Для удобства в событии сброса список любых предыдущих моделей доступен как options.previousModels.

Как сказано в документации, если вы используете reset, вместо add в конце вы получите одно событие reset.

person Maksim Sorokin    schedule 05.01.2014
comment
помните, что fetch() в коллекции по-прежнему будет генерировать события изменения для каждой измененной модели, если только вы не передадите {reset:true} в параметрах. - person mix3d; 01.02.2017