2

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。

有人看到我的错误吗?

4

3 回答 3

4

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

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

或者,您可以只调用_.bindAll不带方法参数的方法,这将自动绑定this所有方法:

_.bindAll(this);

如需进一步阅读,请参阅了解 Backbone 中的 bind 和 bindAll。另请参阅_.bindAll的文档。

于 2012-04-27T01:49:16.943 回答
2

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

var that = this;

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

于 2012-04-26T12:55:39.787 回答
1

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

this.model.stages.each(this.renderStage, this);
于 2012-04-26T21:51:36.217 回答