我有一个视图需要监听模型属性的更改。当该更改事件触发时,我必须调用两个不同的回调函数。我知道这可以使用.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来完成
答案 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);
在这种情况下,您正在向不同的事件(updateSummary
和change: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();});