2016-11-22 10 views
3

バックボーンビューの関数を同じビューの別の関数に渡す必要があります。グローバル関数にはうまく機能する次のアプローチを使用しました。しかし、バックボーン・ビュー・インスタンスが関係している場合、それは機能しません。バックボーン関数をパラメータとして渡す方法

私は、渡された関数のコンテキストが間違っていると考えています。thisは、コンソールに異なるオブジェクトを表示します。

正しく関数を渡し、正しいコンテキストで関数を呼び出す方法はありますか?

JSFiddle

//Backbone view 
mainFunc: function(){ 
    this.intermediateFunc(this.ABC); 
} 
intermediateFunc : function(callback){ 
    console.log(this); //prints the correct view 
    callback(); 
} 
ABC : function(){ 
    console.log(this); //prints 'window' when passed through a function 
} 

答えて

3

最も簡単な方法は、あなたの関数に適切なthisをバインドするFunction.prototype.bindを使用することです。このような何か:

mainFunc: function(){ 
    this.intermediateFunc(this.ABC.bind(this)); 
} 

コールバックのもう一つの一般的なアプローチは、発信者がそれを使用することが望まthisFunction.prototype.callまたはFunction.prototype.applyを供給できるようにすることです:

mainFunc: function(){ 
    this.intermediateFunc(this.ABC, this); 
}, 
intermediateFunc : function(callback, context) { 
    console.log(this); //prints the correct view 
    if(context) 
     callback.call(context); 
    else 
     callback(); 
} 

これの変形はcontextがあると仮定できましたこれはあるかもしれない

mainFunc: function(){ 
    this.intermediateFunc(this.ABC, this); 
}, 
intermediateFunc : function(callback, context) { 
    console.log(this); //prints the correct view 
    context = context || this; 
    callback.call(context); 
} 

thisintermediateFuncにすることになってcallbackがほとんど常にあなたのビューのメソッド(または単純な関数)の1つになると思われる場合に便利です。

さらに別のアプローチは、古いvar _this = thisトリックを使用してintermediateFuncに匿名関数を渡すことになります:あなたの第二のアプローチに基づいて

mainFunc: function() { 
    var _this = this; 
    this.intermediateFunc(function() { return _this.ABC() }); 
} 
+0

ソリューション - https://jsfiddle.net/sachid/bkopgpfr/7/ – SachiDangalla

+1

'intermediateFunc'は同じオブジェクト(' this.intermediateFunc')の関数であるように思われるので、 'callback.call(this)'で直接コールバックを呼び出すことができます。 –

+0

@EmileBergeron True。私はおそらく、デフォルトの 'context'として' this'を使って 'second'オプションに入れます。 –

関連する問題