为什么.on()会工作,但.listenTo()会失败?

时间:2013-04-01 18:46:04

标签: javascript backbone.js backbone-events

我正在研究骨干项目,在视图的初始化函数内部,我试图在集合上设置一个监听器,如下所示:

this.listenTo(this.collection, "change:attr", this.render)

然而,这并没有引起人们的关注。令人极为困惑的是,这实际上在它的位置上起作用:

this.collection.on("change:attr", this.render);

有谁知道为什么会这样?如果必须,我会使用on,但我更倾向于利用listenTo方法。

谢谢!

更新:

请参阅下面的答案,了解有关此问题情况的其他信息......

1 个答案:

答案 0 :(得分:1)

好吧,我弄清楚问题是什么(某种程度上)并且我不确定这个问题是否应该被关闭......但是我认为如果有人遇到同样问题并且没有关闭,我会分享这个问题。

在原始视图的子视图中,我有一个类似于以下内容的事件哈希:

// ...in subview definition
events: {
    'keyup input': 'changeAttr'
},
changeAttr: function(){
    var value = this.$('input').val();
    this.model.set('attr', value); // this.model is in the collection
}

通过此设置,这工作正常:

// inside parent_view:
initialize: function() {
    this.collection.on('change:attr', function(){ alert("changed") });
}

......但这失败了:

initialize: function() {
    this.listenTo('change:attr', function() { alert("changed") });
}

我没有提到的是我使用jQuery在子视图上模拟'keyup'事件,例如。 $('input').trigger('keyup')(这是出于自动化测试目的)。由于某种原因,我不太清楚,Backbone不喜欢这个。更奇怪的是,该属性实际上会改变!因此上面的on方法工作......也许有人在那里可以向我解释为什么会出现这种情况(也许缺少keyup事件的某些属性而listenTo不喜欢它?)