2013-08-09 2 views
5

Простой вопрос: Каков наилучший способ запустить событие «только один раз»?Магистраль: запуск события только один раз на коллекцию 'change'

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

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

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

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


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

ответ

4

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

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

+3

Это скорее обходное решение, а не правильное решение. Лучшим решением было бы использовать 'reset', а не' add'. Вызывается одно событие «перезагрузки». –

2

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

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

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

сбросаcollection.reset([models], [options])

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

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

+1

помните, что 'fetch()' в коллекции будет генерировать события изменения для каждой модели, если вы не перейдете в '{reset: true}' в параметрах. – mix3d

Смежные вопросы