Javascript Backbone.js-更新模型上不希望激发的特定属性;更改“;事件

Javascript Backbone.js-更新模型上不希望激发的特定属性;更改“;事件,javascript,events,backbone.js,Javascript,Events,Backbone.js,在下面的代码中 this.listenTo(this.model, 'change:voteCount', this.changeVoteCount); this.listenTo(this.model, 'change', this.renderTemplate); 如果更新了“voteCount”属性,我想触发“this.changeVoteCount”方法,但不触发“this.renderTemplate” 我已经在谷歌上搜索了大约2个小时,找不到解决方案。我如何满足这个要求 使现代化

在下面的代码中

this.listenTo(this.model, 'change:voteCount', this.changeVoteCount);
this.listenTo(this.model, 'change', this.renderTemplate);
如果更新了“
voteCount
”属性,我想触发“
this.changeVoteCount
”方法,但不触发“
this.renderTemplate

我已经在谷歌上搜索了大约2个小时,找不到解决方案。我如何满足这个要求

使现代化 (只是解释我为什么选择@try catch finally answer)

对于同样遇到这个问题的人,我想澄清一下,应该选择哪个答案作为他们的解决方案

我将描述一些细节来解释我为什么选择这个答案。以下是我的模型结构:

{
   'name': 'some string',
   'location': 'some string',
   'link': 'some string',
   'voteCount': 0    }
否则,“
voteCount
”属性更新,我想触发“更改”事件绑定方法(在我的例子中,
this.renderTemplate

所以我尝试了第一种方法

this.listenTo(this.model, 'change:name change:location change:link', this.renderTemplate);
在这种方法中,如果我在一个位置同时更新“
location
”和“
name
”,那么
this.renderTemplate
方法将触发两次。我想要
这个.renderTemplate方法只要在“
位置
”、“
名称
”或“
链接
”属性单独或同时更新时触发一次

最后,我尝试了以下方法并成功了

this.listenTo(this.model, 'change', function(model) {
            if (_.isEmpty(_.intersection(_.keys(model.changed), ["voteCount"]))) {
                this.renderTemplate.apply(this, arguments);
            }
        });

如果不希望在每次参数更改时都进行渲染,可以指定其中哪一个应触发渲染

this.listenTo(this.model, 'change:param1 change:param2', this.renderTemplate);
编辑:如果不想在多个字段更改时多次渲染,可以使用下划线:


如果在短时间内多次调用render,则只调用render一次。

如果不希望在每次参数更改时都进行渲染,则可以指定哪一个参数应触发render

this.listenTo(this.model, 'change:param1 change:param2', this.renderTemplate);
编辑:如果不想在多个字段更改时多次渲染,可以使用下划线:


如果在短时间内多次调用render,它将只调用render一次。

除了列出@antejan提到的所有要侦听其更改的属性外,您还可以通过编程方式执行此操作

通过这种方式,您可以检查模型的
changed
属性,该属性包含所有已更改的属性

this.listenTo(this.model, 'change', function(model) {
     if (!_.contains(_.keys(model.changed), "voteCount") {
          this.renderTemplate.apply(this, arguments);
     }
});
将多个密钥列入黑名单时,您还可以执行以下操作:

if (_.isEmpty(_.intersection(_.keys(model.changed), ["attr1", "attr2", ...])) { ...
只要您的模型只有几个属性,我更喜欢@antejans的方式来明确列出所有属性,因为它更清楚地说明了发生了什么:

this.listenTo(this.model, "change:attr1 change:attr2 ...", this.renderTemplate);
请注意,在列出多个
change:attr
事件时可能会有性能损失,因为主干将在
for
-循环中调用侦听器。请参见
set()

。。。
如果(!静默){
if(changes.length)此项。_pending=选项;
对于(变量i=0,l=changes.length;i
除了列出@antejan提到的所有您想要监听的属性的更改之外,您还可以通过编程来完成

通过这种方式,您可以检查模型的
changed
属性,该属性包含所有已更改的属性

this.listenTo(this.model, 'change', function(model) {
     if (!_.contains(_.keys(model.changed), "voteCount") {
          this.renderTemplate.apply(this, arguments);
     }
});
将多个密钥列入黑名单时,您还可以执行以下操作:

if (_.isEmpty(_.intersection(_.keys(model.changed), ["attr1", "attr2", ...])) { ...
只要您的模型只有几个属性,我更喜欢@antejans的方式来明确列出所有属性,因为它更清楚地说明了发生了什么:

this.listenTo(this.model, "change:attr1 change:attr2 ...", this.renderTemplate);
请注意,在列出多个
change:attr
事件时可能会有性能损失,因为主干将在
for
-循环中调用侦听器。请参见
set()

。。。
如果(!静默){
if(changes.length)此项。_pending=选项;
对于(变量i=0,l=changes.length;i
@Remco Haszing,您的编辑错误。TOs的意图不是处理特定属性的事件。您的标题在TO期待时没有这样做。在我的回答中添加了关于debounce的注释。@Remco Haszing,您的编辑是错误的。TOs的意图不是处理特定属性的事件。你的标题“主干网”并没有这样做,而TO正在期待它。在我的回答中添加了关于debounce的注释。