Javascript 在事件回调中获取对模型的引用

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.js时,我不确定我是否做对了

我有两个视图和两个模型,我想使用该方法在这两个视图之间触发事件

聚合器声明:

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);

我也最喜欢这个。它是最明确和容易理解的。