2017-03-02 27 views
0

したがって、イベントリスナーを登録するプロトタイプオブジェクトがあります。リスナーは、オブジェクトと、発行されたイベントのソースを示す文字列を受け取ります。 オブジェクトは、いくつかの関数呼び出し(_convertToX(someObj)_convertToY(someObj)、...)の引数になります。
私は何をしようとしていますを動的に私のconvert関数を呼び出す(将来的にはさらに追加される可能性があります)、それぞれ正確に1つの引数(someObj)が必要です。名前に応じて動的に関数を呼び出す

// 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 
}; 

すでに私のアプローチは、すべての配列を作成することです

...そこSO上で同様の質問かもしれませんが、私は右の検索用語を見つける方法を知りませんでしたconverter関数を呼び出し、それらを配列から呼び出します。私が見ている問題は、私がsourceに変換するコンバータを呼び出さないようにするにはどうすればいいですか?

/** 
* 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) ? 
}); 

これはきれいなアプローチですか?これを行う方法?
これを実装するクリーナー/シンプルな方法がありますか?

答えて

3

あなたはコメントを1として

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) 
    }); 
} 

リテラル文字列に基づいて機能にアクセスするためにBracket notationを使用することができ、ソースを除いて、私は、イベントハンドラで、あなたはsourcesのリストを作成することをお勧めしますsource以外のすべてのメソッドを取得して実行します。

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。しかし、私はソースコンバータを除いて**すべてのコンバータを呼び出す必要があるので、私はまだすべてのコンバータ関数の参照を保持する配列が必要でしょうか? – lenny

+0

@lenny、更新された答えを見て、私は 'sources'のリファレンスを保存することを好むでしょう – Satpal

関連する問題