简单问题:“只有一次”触发事件的最佳方法是什么?
我在骨干中有一个具有多个模型的集合。有时,多个模型的属性会立即更新,在集合上触发多个“更改”事件。
仅将“更改”事件触发一次,将所有属性更改分组在一起的最佳方法是什么?
目前我最好的想法是使用计时器,但这只会捕获第一个模型属性更改。
所有建议,想法和解决方案都受到重视。谢谢你:)。
上下文: 在这种情况下,事件会触发计算量很大的函数,因此必须避免多次运行。
答案 0 :(得分:4)
每当您批量更新模型上的属性时,请{silent:true}
作为选项传递,will suppress any events from being fired.
然后触发一个自定义事件,一个视图或多个视图都会监听它。
答案 1 :(得分:2)
您可以“去抖”集合中响应变更事件的方法,但您必须手动确定哪些模型已更改:
Col = Backbone.Collection.extend({
modelChanged: _.debounce(function() {
// handle model changes
}, delayInMs),
initialize: function() {
this.collection.on('change', this.modelChanged, this);
}
})
答案 2 :(得分:2)
您可以尝试重置集合,而不是添加元素。见Collection reset method description:
重置
collection.reset([models], [options])
一次添加和删除模型一切都很好,但有时您需要更改很多模型,而只是批量更新集合。使用重置将集合替换为新的模型列表(或属性哈希值),最后触发单个“重置”事件。返回新设置的模型。为方便起见,在“重置”事件中,任何先前模型的列表都可用作options.previousModels。
正如文档所述,如果您使用reset
,而不是add
,您最终将获得一个reset
个事件。