1

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

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

然而,这并没有抓住这个事件。非常令人困惑的是,这实际上可以代替它:

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

有谁知道为什么会发生这种情况?如果必须,我会使用on,但我更愿意利用该listenTo方法。

谢谢!

更新:

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

4

1 回答 1

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不喜欢那个?)

于 2013-04-01T19:22:31.693 回答