2016-12-21 15 views
0

私は、角度ファクトリ/ファンクション名のマッピングを含む設定ファイルを読んでいます。ファクトリ/ファンクションの名前は、マッピングの文字列として格納されます。私は設定から​​読み込んだFactory/Functionをどのように実行できるのでしょうか?ファクトリ/ファンクションを文字列から呼び出す

windowにアクセスできない工場以外の場合はwindow[factory][functionName]()と呼ぶことができます。

var factory; 
var factoryName = getFactory(config.sendTelemetry); 

if (factoryName === 'TelemetryFactory') { 
    factory = TelemetryFactory; 
} else if (factoryName === 'DebugFactory') { 
    factory = DebugFactory; 
} 

factory[functionName](); 

サンプル設定ファイル::

は、私のようなものに頼らなければならないでしょう

// Sample config file 
var config = { 
    'sendTelemetry': { 
     'factory': 'TelemetryFactory', 
     'functionName': 'sendTelemetry' 
    }, 
    'logDebug': { 
     'factory': 'DebugFactory', 
     'functionName': 'logDebug' 
    } 
} 

答えて

1

機能だけで正常に機能をスコープしている場合は、長いswitch声明を避けるために、関数の参照に名前から検索マップの一回限りの作成を行うことができます。

var funcMap = { 
    TelemetryFactory: TelemetryFactory, 
    DebugFactory: DebugFactory 
}; 

か(潜在的にエラーを回避するために各機能の.nameプロパティを使用して、関数参照の配列からマップを構築することにより-prone)繰り返し、:ES6で

// build lookup map 
var funcs = [ TelemetryFactory, DebugFactory ]; 
var funcMap = {}; 
funcs.forEach(function(f) { 
    funcMap[f.name] = f; 
}); 

ES6は、あなたがの名前を渡すことができ、オブジェクトリテラル構文を持っているので、それは、さらに簡単になり、変数(またはfunctイオン)と、それは自動的にその変数の名前と値を持つキーを作成します。マップを構築するために使用します上記の3つの方法のどちら

let funcMap = { TelemetryFactory, DebugFactory }; 

を、ディスパッチは、マップを経由して、その後些細な操作です:

funcMap[factoryName](); 
-1

あなたが最初の文字列を評価する必要があるだろうように見えます:

eval(factory[functionName])();

希望すると便利です:)

+0

これは正しい構文ではありません – Alnitak

+0

正しいです。私はちょうど工場が評価を必要としていることに気づいた。 –

+0

'eval()'なしで行う方法はありますか? – Jon