0

我对如何使用仍然很困惑_.bindAll()。我知道有时指的是另一个对象,因此我们需要使用_.bindAll()它来纠正它。

例如,这里我不能使用this.setLevelTimer(false),因为this是指向setTimeout,所以我把_.bindAll().

如果有多个实例this未正确指向怎么办。我使用多个_.bindAll()s 吗?

var model = Backbone.Model.extend({
    initialize: function(){

    }
    ...
    setLevelTimer : function (){

        if (delta < 0){
             this.gameOver();
        } else {
            gameState.timer = setTimeout(function(){
                return this.setLevelTimer(false);  //"this" does not work
            }, 30);
        }
    }
    ...
});
4

2 回答 2

1

_.bindAll 将 this 对象绑定为函数范围的初始化对象。

如果您在函数内有嵌套范围,则 this 对象可能不同。

例如

setLevelTimer: function(){
  // this should equal to the initialized model
  $("a").click(function(){
    // the this variable here is the clicked DOM object - not the initialized model
  });
}

这个问题的一个常见解决方案是在函数的第一行设置一个变量,然后你也可以在嵌套范围内使用它(当然只要它没有被重新定义),例如:

setLevelTimer: function(){
  // this should equal to the initialized model
  var that = this;
  $("a").click(function(){
    // the that variable here is the initialized model
  });
}
于 2012-09-05T11:58:21.507 回答
0

_.bindAll将给定对象的函数属性'绑定到给this定对象。文档来源

您正在做的是假设this在您提供给的匿名函数中正确设置setTimeout,但那怎么可能,因为该匿名函数不是您的模型的函数属性。

这就是为什么您必须为匿名函数提供正确this的 ,至少有以下两种方式:

var self = this; // store correct this into a variable
gameState.timer = setTimeout(function(){
     return self.setLevelTimer(false); 
}, 30);

或者

// use bind to bind your anonymous functio to the right this
gameState.timer = setTimeout(_.bind(function(){ 
   return this.setLevelTimer(false); 
}, this), 30);

希望这会有所帮助(并为您解决问题)!

附言

至于回答你原来的问题。这个问题不是 的错_.bindAll,你应该_.bindAll(this)在你的initialize-function 中使用来保持 Backbone 对象的函数绑定到正确的this,但是由于 bindAll 不会影响你动态创建的匿名函数,你需要使用其他措施(一些其中我在上面描述过)以使它们与this您想要的绑定。

于 2012-09-05T12:04:51.360 回答