在视图类中丢失Backbone这个上下文

时间:2012-04-26 11:35:40

标签: backbone.js scope this

渲染嵌套视图时,我的this上下文丢失了。这是我的代码:

Workflow.Views.Wall = Backbone.View.extend({
  tagName:    'div',
  id:         'wall',
  className:  'row-fluid span12',

  initialize: function() {
    _.bindAll(this, 'render');
    this.model.view = this;
  },

  render: function() {
    this.model.stages.each(this.renderStage);
    return this;
  },

  renderStage: function(model) {
    var stageView = new Workflow.Views.Stage({ model: model });
    //this is DOMWindow
    this.$el.append(stageView.el);
  }
});

所以“墙”有许多“阶段”。在我的renderStage函数中,this是DOMWindow。

有人看到我的错误吗?

3 个答案:

答案 0 :(得分:4)

您需要将renderStage方法绑定到Workflow.Views.Wall视图...基本上这样才能拥有正确的this上下文。

initialize: function() {
  _.bindAll(this, 'render', 'renderStage');
  this.model.view = this;
}

或者,您可以在没有方法参数的情况下调用_.bindAll,这会自动将this绑定到所有方法:

_.bindAll(this);

如需进一步阅读,请参阅Understanding bind and bindAll in Backbone。另请参阅_.bindAll的文档。

答案 1 :(得分:2)

你的问题是你在我猜的jQuery each()函数中使用它。 “这个”指的是舞台而不是视图。 一个简单的解决方法是将此行添加到渲染方法的开头:

var that = this;

然后在你的each()函数中使用“that”。

答案 2 :(得分:1)

如果阶段是集合,或者更确切地说,每个方法都来自下划线,则需要将上下文作为第二个参数传递:

this.model.stages.each(this.renderStage, this);