2017-11-12 5 views
0

Ich weiß, dass ich kein Funktionsobjekt über JSON übergeben kann, gibt es eine andere Möglichkeit, eine Callback-Funktion über JSON zu übergeben?Ist es möglich, einen JS-Callback über JSON zu übergeben?

window.onpopstate = function(e) { 
    var state = e.state; 

    switch(state['method']) { 
     case 'updateFields': 
      updateFields(state); 
     break; 
    } 
} 

Wo state etwas wie folgt strukturiert:

{'method':'updateFields', ...} 

Und ich wünsche dem Schaltergehäuse zu entfernen und stattdessen rufen direkt die Funktion, die ähnlich wie diese:

window.onpopstate = function(e) { 
    var state = e.state; 

    state['method'](state); 
} 

ich tun Ich weiß nicht, wie ich das schaffen soll.

+1

Es könnte klarer und einfacher zu beantworten sein, wenn Sie den Code veröffentlichen! – 3Dos

+0

@ 3Dos ging voran und umformuliert/hinzugefügt Code-Beispiele :) –

Antwort

2

Sie sind auf dem richtigen Weg; Die Hauptsache, die Sie ändern müssen, besteht darin, alle Ihre Methoden zu einem Objekt zu machen. Dann können Sie den Methodennamen verwenden, um direkt von diesem Objekt auf die Methode zuzugreifen:

var methods = { 
    updateFields: function(state) { 
     // do something with state 
    }, 
    anotherMethod: function(state) { 
     // etc. 
    } 
}; 

window.onpopstate = function(e) { 
    var state = e.state; 
    var method = methods[state.method]; 
    if(method) { 
     method(state); 
    } else { 
     console.log("Unknown method", state.method); 
    } 
}; 
+2

Statt 'if (Methode)' 'Sie if (typeof Methode ===‚Funktion‘)' bestimmte verwenden könnte sein Sie es tatsächlich anrufen können. – 3Dos

+0

Guter Punkt! In Anbetracht dessen, dass dies in einem 'popstate'-Listener verwendet wird, ging ich davon aus, dass das fragliche JSON-Objekt eines ist, das OPs eigenen' pushState'- oder 'replaceState'-Code erstellt hat. Aber in einem allgemeineren Fall wäre der "typeof" -Ansatz kugelsicherer, also vielen Dank dafür. –

+0

Ich mag diesen Ansatz mehr als den Switch-Fall, obwohl ich nicht mag, dass ich noch die Methoden innerhalb 'Methoden' definieren muss. Ich hatte auf einen Ansatz gehofft, bei dem Funktionen nicht aufgelistet werden mussten und somit im Wesentlichen für das "popstate" -Ereignis anonym bleiben konnten. Während das "popstate" -Ereignis in Ihrem Code nicht weiß, was die Funktionen sind, müssen sie dennoch zentral in dem "Methoden" -Objekt gespeichert werden. Wenn das Sinn macht, plus eins noch für viel saubereren Code dann mit Switch Fällen (die ich meist verachten). –

Verwandte Themen