2017-06-29 11 views
0

ein Szenario vorstellen, wie so:in Aufruf ein zusätzliches Argument übergeben an eine Funktion

var obj = { 
    renderSubGame: renderComponent 
} 

und renderSubGame mit einem Argument aufgerufen this.subGameInfo etwa so:

renderSubGame(this.subGameInfo) 

damit dieses Argument wäre übergeben an renderComponent (was selbst ist eine Sache, die ich will)

aber renderComponent erfordert auch ein Argument für seinen Parameter "Komponente", die in diesem Fall möchte ich übergeben Argument zu "subGame" sein:

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

aber dann verliere ich den Parameter, der an renderSubGame übergeben wird.

Also wie bekomme ich sowohl 'subGame' (via obj) als auch thisSubGameInfo (via Funktionsaufruf) als Argumente für renderComponent?


Genauer gesagt ist dies das allgemeine Szenario in meinem Code:

Datei/requirejs Modul: subGame.js

mit Code, so dass subGame.render() ruft eine geschlossene Funktion renderSubGame(), die schließlich view.renderSubGame (thisSpielinfo) aufruft.

Datei/requirejs Modul: view.js

Dies ist, was das Modul kehrt zur Ansicht:

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

und das ist, was ich renderComponent zu grob sein wollen:

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.'; 
    } 
} 

(Render ist ein anderes Modul, das ein Objekt von Methoden zurückgibt, von denen eines SubGame ist)


Also mein Problem ist, dass das Argument (ThisSGameInfo) RenderComponent nicht erreichen.

Ich habe versucht, Lösungen mit .apply() oder .call(), aber sie haben nicht so funktioniert, wie ich will.

Wenn ich RenderSubGame: renderComponent verwenden würde, die die Argumente von renderSubGame enthalten würde, also wie kann ich 'SubGame' zu diesen Argumenten hinzufügen?

Oder alternativ, wie kann ich:

renderSubGame: renderComponent('subGame') 

die Argumente

renderSubGame (this.subGameInfo) 

zusätzlich zu 'Teilspiel' aufzunehmen?

+0

Warum machst du nicht 'var obj = {renderSubGame: renderComponent, Komponente: 'subGame'}' und dann beide in 'subGame.render()'? –

+0

Weil ich irgendwann andere Komponenten verwenden möchte. Zum Beispiel möchte ich vielleicht renderComponent ('line'), die, nach Ihrem Vorschlag, würde erfordern: 'var obj = {renderSubGame: renderComponent, renderLine: renderComponent, Komponente: 'subGame', Komponente: 'line'} 'das ist offensichtlich nicht gültig – mchach24

+0

' var obj = {renderSubGame: renderKomponente, renderSubGameArguments: ['subGame'], renderLine: renderKomponente, renderLineArguments: ['line']} 'oder noch besser (meiner Meinung nach)' var obj = {renderSubGame: {target: renderComponent, args: ['subGame']}}, renderLine: {target: renderComponent, args: ['line']}} ' –

Antwort

1

Zunächst betrachten Sie den Code versucht:

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

Was Sie da tun, ist die obj.renderSubGame auf den Wert von zurück renderComponent('subGame') aufrufen. Wenn Sie später obj.renderSubGame() tun, ruft es nicht wieder renderComponent auf. Es ruft den Rückgabewert des Aufrufs auf, der bei der Initialisierung von obj ausgeführt wurde.

Sie können den gewünschten Effekt erhalten, indem Sie:

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

bind erstellt eine neue Funktion mit den ersten Argumente bereits auf einige Werte gebunden. Das erste Argument zu bind setzt this innerhalb der Funktion. Ich habe es auf undefined festgelegt, da Sie this in renderComponent nicht verwenden. Dann macht das zweite Argument es so, dass, wenn obj.renderSubGame('foo', 1) aufgerufen wird, es dem Aufruf renderComponent('subGame', 'foo', 1) entspricht.

Verwandte Themen