jQuery喜欢Backbone listenTo的事件映射?

时间:2014-10-07 15:56:49

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

我有一个视图需要监听模型属性的更改。当该更改事件触发时,我必须调用两个不同的回调函数。我知道这可以使用.on喜欢

轻松完成
model.on({
     'change:title' : updateTitle,
     'change:title' : updateSummary
});

但是当使用listenTo时,我必须用多行编写

this.listenTo(model, 'change:title', updateTitle);
this.listenTo(model, 'change:title', updateSummary);

有没有办法避免多次重写listenTo语句? 或者这个问题是否意味着我的代码结构不正确,我应该重新考虑我的方法?

一个简单的替代方案是我从updateTitle调用updateSummary,但我只是想知道是否可以使用object.listenTo来完成

2 个答案:

答案 0 :(得分:1)

正如@muistooshort在评论中已经提到的那样:

var objParam={
     'change:title' : updateTitle,
     'change:title' : updateSummary
};
model.on(objParam);

请仔细查看,objParam有两个名称相同的,这会在strict模式下出错,否则只会覆盖键的前一个值&因此,console.log(objParam)打印

{         'change:title' : updateSummary    }

这是作为.on调用的参数传递的内容。

答案 1 :(得分:1)

  
    

这个问题是否意味着我的代码没有正确构建,我应该重新考虑我的方法?

  

我没有看到有两个(或更多)听众注册到同一事件的任何问题。这是解耦的核心点。当触发相同的事件时,您可以使用不同的(解耦的)视图来更新其内容。

我不知道您的其他代码,但我认为您的updateSummary除了change:title之外还会听取其他更改事件:

this.listenTo(model, 'change:summary', updateSummary);

在这种情况下,您正在向不同的事件(updateSummarychange:title)注册相同的侦听器(change:summary)。没关系,使用listenTo,您可以以不同的方式不同的视图更新连接到不同的模型事件。

  
    

有没有办法避免多次重写listenTo语句?

  

也许是一种矫枉过正,但您可以使用下划线提供的功能来实现这样的功能:

_.each([updateTitle, updateSummary], _.partial(this.listenTo, model, 'change:title'), this);
  
    

一个简单的替代方案是我从updateTitle调用updateSummary,但我只是想知道是否可以使用object.listenTo来完成

  

我担心listenTo只接受回调函数,而不是函数数组。

如果您仍然担心多次在同一事件上listenTo,您可以创建一个更通用的功能,让我们说update,更新 title < / em>和摘要,并仅注册此更通用的更新功能:

this.listenTo(model, 'change:title', update);

或者如果您不想要其他功能,可以使用匿名功能:

this.listenTo(model, 'change:title', function() {updateTitle(); updateSummary();});