2

我不确定我是否做对了,第一次玩 Backbone.js。

我有两个带有两个模型的视图,我想使用事件聚合器方法在两者之间触发事件。

聚合器声明:

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方法并且失去了我的第一个视图不知道模型的好处。有什么建议么?

4

3 回答 3

3

我认为你有绑定问题。

您有两种方法可以确保this将是View 实例

1.使用bindAll

在你的View.initialize()你可以添加这一行:

_.bindAll( this, "removeRow" )

@DerickBailey 关于此事的有趣帖子

2. 在绑定声明中使用可选的第三个参数

像这样:

this.eventAggregator.bind("removeRow", this.removeRow, this);

关于此事的骨干文档

于 2012-05-30T17:02:27.473 回答
2

提供您的 View 对象作为绑定方法的第三个参数:

this.eventAggregator.bind("removeRow", this.removeRow, this);

第三个参数是调用回调的上下文。请参阅文档

此外,您可以使用.on()而不是更短的.bind() ...

于 2012-05-30T16:55:39.830 回答
2

您需要绑定this,以免丢失范围。另一个答案的博客链接使用下划线bindAll

initialize: function() {
  _.bindAll(this, 'removeRow');
  this.eventAggregator.bind("removeRow", this.removeRow);
  this.model.get("rows").each(function(row) {
    // Do stuff
  }); 
},
于 2012-05-30T16:55:47.553 回答