0

私はまだ使用方法について非常に混乱しています_.bindAll()これは別のオブジェクトを参照することがあるため_.bindAll()、修正するために使用する必要があることを理解しています。

たとえば、ここでは、を指しているthis.setLevelTimer(false)ため、を使用できません。ここで、をどこに配置しますか。 thissetTimeout_.bindAll()

this正しく指し示していないインスタンスが複数ある場合はどうなりますか。複数_.bindAll()のを使用しますか?

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オブジェクトを関数スコープの初期化されたオブジェクトにバインドします。

関数内にネストされたスコープがある場合、このオブジェクトは異なる場合があります。

例えば

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少なくとも次の2つの方法があります。

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

これがお役に立てば幸いです(そしてあなたのために物事をクリアします)!

PS

あなたの元の質問に答えるために。この問題はのせいではありません。Backboneオブジェクトの関数を正しいものにバインドするために-function内_.bindAllで使用する必要がありますが、bindAllはその場で作成する匿名関数に影響を与えないため、他の手段を使用する必要があります(一部そのうち私が上で説明した)あなたが望むものにそれらをバインドしておくために。_.bindAll(this)initializethisthis

于 2012-09-05T12:04:51.360 に答える