Backbone:在集合“更改”上仅触发一次事件

时间:2013-08-09 16:15:37

标签: backbone.js backbone-events backbone-collections

简单问题:“只有一次”触发事件的最佳方法是什么?

我在骨干中有一个具有多个模型的集合。有时,多个模型的属性会立即更新,在集合上触发多个“更改”事件。

仅将“更改”事件触发一次,将所有属性更改分组在一起的最佳方法是什么?

目前我最好的想法是使用计时器,但这只会捕获第一个模型属性更改。

所有建议,想法和解决方案都受到重视。谢谢你:)。


上下文: 在这种情况下,事件会触发计算量很大的函数,因此必须避免多次运行。

3 个答案:

答案 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个事件。