2017-03-02 5 views
0

Ich habe also ein Prototyp-Objekt, das einen Ereignis-Listener registriert. Der Listener empfängt ein Objekt und eine Zeichenfolge, die die Quelle des ausgegebenen Ereignisses angibt. Das Objekt wird das Argument einiger Funktionsaufrufe sein (_convertToX(someObj), _convertToY(someObj), ...).
Nun, was ich versuche zu tun ist dynamisch rufen Sie meine convert Funktionen (wie es möglicherweise einige mehr in der Zukunft hinzugefügt werden), jeder von ihnen dauert genau ein Argument (someObj).Funktionen dynamisch aufrufen, abhängig vom Namen

// constructor 
const MyFactory = function() { 
    // ... 

    $rootScope.$on('someObj:changed', (event, someObj, source) => { 
     // TODO: call converters dynamically, but not the one which converts back to the source 
     // source can be 'X', 'Y' or 'Z' 
    }); 
} 

MyFactory.prototype._convertToX = function (someObj) { 
    // TODO: convert to X and emit 
}; 

MyFactory.prototype._convertToY = function (someObj) { 
    // TODO: convert to Y and emit 
}; 

MyFactory.prototype._convertToZ = function (someObj) { 
    // TODO: convert to Z and emit 
}; 

Es könnte schon Antworten auf SO auf ähnliche Fragen, aber ich wusste nicht, wie man die richtigen Suchbegriffe zu finden ...

Mein Ansatz ein Array zu erstellen wäre mit allen converter Funktion und rufen Sie sie aus dem Array. Das Problem, das ich sehe, ist, wie kann ich sicherstellen, dass ich den Konverter nicht anrufe, der zurück zu source konvertiert?

/** 
* Hold references to all converters. 
* @type {Array<function>} 
*/ 
this._converters = [ 
    this._convertToX, 
    this._convertToY, 
    this._convertToZ 
]; 

// assume source is 'Z' 
$rootScope.$on('someObj:changed', (event, someObj, source) => { 
    // how to call each function in this._converters with someObj as argument 
    // except this._convertToZ(someObj) ? 
}); 

Ist das ein sauberer Ansatz? Wie macht man das?
Oder gibt es eine sauberere/einfachere Möglichkeit, dies zu implementieren?

Antwort

3

Sie können Bracket notation verwenden, um die Funktion für den Zugriff basierend auf Stringliteral

const MyFactory = function() { 
    //Store the reference to a variable 
    const self = this; 

    $rootScope.$on('someObj:changed', (event, someObj, source) => { 
     //Use Bracket notation to access the function 
     self["_convertTo" + source](someObj) 
    }); 
} 

Wie pro Kommentar, außer Quelle, würde ich empfehlen Sie eine Liste von sources, dann in der Ereignisbehandlungsroutine erstellen lade alle Methoden außer der Quelle und führe sie aus.

const MyFactory = function() { 
    //Store the reference to a variable 
    const self = this; 
    const sources = ['X', 'Y', 'Z']; 

    $rootScope.$on('someObj:changed', (event, someObj, source) => { 
     //Use Bracket notation to access the function 
     var expectSource = sources.filter(x => x !== source); 
     expectSource.forEach(x => self["_convertTo" + x](someObj))   
    }); 
} 
+0

Thx für die Antwort. Aber ich muss alle Konverter ** außer ** der Quellkonverter aufrufen, also würde ich noch ein Array benötigen, um alle Konvertierungsfunktionsreferenzen richtig zu halten? – lenny

+0

@Lenny, Siehe aktualisierte Antwort, ich werde es vorziehen, die Referenz von Quellen zu speichern – Satpal

Verwandte Themen