我有一个模型,在初始化函数中,我有以下代码:
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() });
补丁函数被调用两次,并且有两次往返服务器。如果可能的话,我想将其保留一次往返。
任何人都可以帮忙解决这个问题吗?
非常感谢
大卫
答案 0 :(得分:5)
您的patch
方法会针对'change:re'
事件调用一次,并再次调用'change:read'
事件。 Backbone并不知道你的意思是"告诉我,如果re
或read
中至少有一个发生了变化,它就会知道你是否想要告诉{{{ 1}}更改并告知re
是否更改。
您可以侦听read
个事件并使用changed
哈希自行进行过滤:
已更改
'change'
已更改属性是内部哈希,其中包含自上次集以来已更改的所有属性。
这样的事情:
model.changed
然后:
this.listenTo(this, 'change', this.patch);
答案 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()之前等待的时间。在该时间段内,可能会发生任意数量的更改事件,但只会调用一次保存。