2017-06-29 4 views
0

そうのようなシナリオを想像:関数の呼び出し中に追加の引数を渡す

var obj = { 
    renderSubGame: renderComponent 
} 

とrenderSubGameがそうのような引数this.subGameInfoと呼ばれている。したがって、その引数は以下のようになり

renderSubGame(this.subGameInfo) 

でもrenderComponentに渡されましたが、renderComponentにもパラメータ "component"の引数が必要です(この場合、渡される必要があります)。引数は "subGame"になる:

var obj = { 
    renderSubGame: renderComponent('subGame') 
} 

しかし、私はrenderSubGameに渡されたパラメータを失う。

したがって、renderComponentの引数として 'subGame'(obj経由)とthis.subGameInfo(関数呼び出し経由)の両方を取得できますか? subGame.render()が封入され呼び出しようsubGame.js

コードで:

ファイル/ requirejsモジュール:


より具体的には、これは私のコードで一般的なシナリオであります関数renderSubGame()は、最終的にview.renderSubGame(this.subGameInfo)を呼び出します。

ファイル/ requirejsモジュール:

function renderComponent(component) { 
    var renderMethods = _(render).getObjectMethodNames();     
     if (_(renderMethods).contains(component)) { 
      render[component](*INITIAL_ARGS_FROM_SUBGAME.JS*); 
    } else { 
     throw 'Error: component method render.' + component + '() not 
     recognized as a method of render.'; 
    } 
} 
:これは私がrenderComponentは、大きくなりたいもの

return: { 
    renderSubGame: renderComponent('subGame') 
} 

とある:view.jsは

これは、ビューのためのモジュールが返すものです

(レンダリングは、メソッドのオブジェクトを返す別のモジュールで、そのうちの1つはsubGameです)


私の問題は、引数(this.subGameInfo)がrenderComponentに到達しないことです。

私は.apply()または.call()で解決策を試しましたが、私が望むように動作していないようです。

renderSubGame:renderComponentを使用すると、renderSubGameの引数が含まれているので、どうすればそれらの引数に 'subGame'を追加できますか?

または代わりに、どのように私は得ることができます:

renderSubGame: renderComponent('subGame') 

'サブゲーム' に加えて、

renderSubGame (this.subGameInfo) 

の引数を含めるために?

+0

var obj = {renderSubGame:renderComponent、component: 'subGame'} 'を実行してから、' subGame.render() 'で両方を使用するのはなぜですか? –

+0

最終的に私は他のコンポーネントを使用する予定です。例えば、私はおそらく、あなたの提案にしたがって、renderComponent( 'line')をしたいと思います: 'var obj = {renderSubGame:renderComponent、renderLine:renderComponent、component: 'subGame'、component: 'line'} '明らかに有効ではない – mchach24

+0

' var obj = {renderSubGame:renderSubGame:renderSubGameArguments:['subGame']、renderLine:renderComponent、renderLineArguments:['line']} 'またはさらに良い(私の意見では)' var obj = {renderSubGame:{target:renderComponent、args:['subGame']}、renderLine:{target:renderComponent、args:['line']}} ' –

答えて

1

まず、あなたがしようとしたコードを考えてみます。

あなたが renderComponent('subGame')を呼び出しから返された値 からobj.renderSubGameが設定されてやっている
var obj = { 
    renderSubGame: renderComponent('subGame') 
} 

obj.renderSubGame()を後で実行すると、renderComponentが再び呼び出されることはありません。 objが初期化されたときの呼び出しの戻り値を呼び出します。

次の操作を行うことにより、必要な効果を得ることができます:

var obj = { 
    renderSubGame: renderComponent.bind(undefined, 'subGame') 
} 

bindは、すでにいくつかの値にバインドされた最初の引数を持つ新しい関数を作成します。 bindの最初の引数は、関数内にthisを設定します。 renderComponentthisを使用していないので、undefinedに設定しました。次に、第2引数は、obj.renderSubGame('foo', 1)が呼び出されたときにrenderComponent('subGame', 'foo', 1)を呼び出すのと同じになるようにします。

関連する問題