Javascript 在事件回调中获取对模型的引用
第一次玩Backbone.js时,我不确定我是否做对了 我有两个视图和两个模型,我想使用该方法在这两个视图之间触发事件 聚合器声明:Javascript 在事件回调中获取对模型的引用,javascript,jquery,events,backbone.js,Javascript,Jquery,Events,Backbone.js,第一次玩Backbone.js时,我不确定我是否做对了 我有两个视图和两个模型,我想使用该方法在这两个视图之间触发事件 聚合器声明: Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events); 因此,在一个视图中,我有这样一行代码,它将触发removeow方法 this.eventAggregator.trigger("removeRow", this.row); 从另一个角度看 MyView = Back
Backbone.View.prototype.eventAggregator = _.extend({}, Backbone.Events);
因此,在一个视图中,我有这样一行代码,它将触发removeow
方法
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
?我曾考虑将模型传递给第一个视图,然后在触发器调用中将其传回,但这似乎使事件聚合器的整个要点变得毫无意义。如果我有这个模型,我可以直接调用.remove
方法,这样就失去了第一个视图不知道模型的好处。有什么建议吗?提供视图对象作为绑定方法的第三个参数:
this.eventAggregator.bind("removeRow", this.removeRow, this);
第三个参数是调用回调的上下文。看
此外,您还可以使用.on()而不是.bind(),后者较短。您需要绑定此
,这样范围就不会丢失。另一个答案上的博客链接使用下划线的bindAll
initialize: function() {
_.bindAll(this, 'removeRow');
this.eventAggregator.bind("removeRow", this.removeRow);
this.model.get("rows").each(function(row) {
// Do stuff
});
},
我想你的装订有问题
有两种方法可以确保此
将成为视图实例:
1.使用bindAll
在视图.initialize()
中,可以添加以下行:
_.bindAll( this, "removeRow" )
2.在绑定声明中使用可选的第三个参数
像这样:
this.eventAggregator.bind("removeRow", this.removeRow, this);
我也最喜欢这个。它是最明确和容易理解的。