Backbone listenTo多个属性触发多个事件

时间:2015-02-24 22:53:32

标签: backbone.js backbone-events

我有一个模型,在初始化函数中,我有以下代码:

this.listenTo(this, 'change:re change:read', this.patch);

补丁功能如下所示:

patch: function(object) {
  this.save(object.changed, { patch: true });
},

在我的应用程序的其他地方,我可以运行:

model.set({ re: 1 });

或:

model.set({ read: new Date() });

两者都完美无缺,但是当我打电话时:

model.set({ re: 1, read: new Date() });

补丁函数被调用两次,并且有两次往返服务器。如果可能的话,我想将其保留一次往返。

任何人都可以帮忙解决这个问题吗?

非常感谢

大卫

2 个答案:

答案 0 :(得分:5)

您的patch方法会针对'change:re'事件调用一次,并再次调用'change:read'事件。 Backbone并不知道你的意思是"告诉我,如果reread中至少有一个发生了变化,它就会知道你是否想要告诉{{{ 1}}更改并告知re是否更改。

您可以侦听read个事件并使用changed哈希自行进行过滤:

  

已更改 'change'

     

已更改属性是内部哈希,其中包含自上次以来已更改的所有属性。

这样的事情:

model.changed

然后:

this.listenTo(this, 'change', this.patch);

演示:https://jsfiddle.net/ambiguous/ja20z021/

答案 1 :(得分:0)

您可以使用_.debounce来修改补丁功能,如下所示:

this.listenTo(this, 'change:re change:read', this.patch);

然后:

patch: _.debounce(function(object){
    this.save(object.changed, { patch: true });
},100)

" 100"以毫秒为单位,即函数在调用save()之前等待的时间。在该时间段内,可能会发生任意数量的更改事件,但只会调用一次保存。