我不确定我是否正确行事,第一次玩Backbone.js。
我有两个模型的两个视图,我想使用event aggregator方法在两者之间触发事件。
聚合器声明:
Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);
因此,在一个视图中,我有一条这样的行,它将触发removeRow
方法。
this.eventAggregator.trigger("removeRow", this.row);
在另一个视图中
MyView = Backbone.View.extend({
initialize: function() {
this.eventAggregator.bind("removeRow", this.removeRow);
this.model.get("rows").each(function(row) {
// Do stuff
});
},
removeRow: function(row) {
// row is passed in fine
// this.model is undefined
this.model.get("rows").remove(row);
}
});
我想我理解为什么this.model
未定义,但是我可以做些什么来维护引用,以便我可以在回调中使用this.model
?我考虑将模型传递给第一个视图,然后在trigger
调用中将其传回,但这似乎使事件聚合器的整个点无意义。如果我有模型,我可以直接调用.remove
方法,并且失去了我的第一个视图不知道模型的好处。有什么建议吗?
答案 0 :(得分:3)
我认为你有绑定问题。
您有两种方法可以确保this
成为查看实例:
bindAll
在View.initialize()
中,您可以添加以下内容:
_.bindAll( this, "removeRow" )
Interesting post of @DerickBailey about this matter
像这样:
this.eventAggregator.bind("removeRow", this.removeRow, this);
答案 1 :(得分:2)
提供View对象作为bind方法的第三个参数:
this.eventAggregator.bind("removeRow", this.removeRow, this);
第三个参数是调用回调的上下文。请参阅docs。
此外,您可以使用 .on()代替 .bind(),这更短......
答案 2 :(得分:2)
您需要绑定this
,以免范围丢失。另一个答案的博客链接使用下划线的bindAll
initialize: function() {
_.bindAll(this, 'removeRow');
this.eventAggregator.bind("removeRow", this.removeRow);
this.model.get("rows").each(function(row) {
// Do stuff
});
},