2016-06-29 7 views
0

注:angularjs execute expression from variableと似ていますが、使用しているすべての可能性とデータセットを使用してスコープを混乱させたくありません。文字列からのAngularJS式

私はAngularの式であらかじめ決められた数式を利用したいと考えています。

例:

<div ng-repeat="item in myArray"> 
    <span>{{item['propertyOne'] + item['propertyTwo']}}</span> 
</div> 

を、私はこれを実現する方法を:私はそれが好きなタイプされたかのようにformulaValueで式が評価されます

var config = { 
    "Test": { 
     name: "test", 
     formula: true, 
     formulaValue: "item['propertyOne'] + item['propertyTwo']" 
    } 
    } 

<div ng-repeat="item in myArray"> 
    <span ng-if="config[item.name].formula">{{config[item.name].formulaValue}}</span> 
</div> 

?これはかなり大量の設定で設定されているので、それぞれのタイプの式に対して$ scope関数を作成することは可能ではありません。

+0

この設定は既に構築されており、その文字列形式を使用する必要がありますか?または、設定を再構成できますか? – charlietfl

+0

これは再構成することができます。この例は非常にシンプルで完全に表現されているわけではありません。 –

+0

これで 'eval()'を使うことができますが、セキュリティのために常にevalを避けるのが最善です。連結のために、配列にフィールド名だけを持つプロパティは、より理想的です。 – charlietfl

答えて

1

は、最も理想的なコンフィギュレーション設定が、最悪の場合、あなたがうまくによるセキュリティに好かれていないeval()を使用する必要があります

何かのように:

function parseConfig(item, configKey){ 
    if(config[configKey].formula){ 
     return eval(config[configKey].formulaValue); 
    } 
} 
$scope.parseConfig = parseConfig; 

はあなたの設定とサービスのそれを置きますしかし今のところ、範囲に入れます。それは、私は、あなたがformulaTypeをチェックして、プロパティで必要とされるものだろう

var config = { 
    "Test": { 
     name: "test", 
     formula: true, 
     formulaType: 'concat', 
     formulaValue: ['propertyOne','propertyTwo'] 
    } 

のようなものを見て設定を好む私だった場合を考慮して

{{parseConfig(item, 'Test')}} 

ようなものになるだろうeval()を使用しないformulaValueに

+0

'$ parse'はここで良いかもしれません。 –

+0

場合によっては、より複雑な操作にevalを使用する必要が生じることがありますが、数式タイプを持ち、各タイプを処理する関数を調整することはあまり悪くありません。しかし、私はおそらくいくつかの数式を評価する必要があります。私が設定を完全に制御できる場合、この場合evalのセキュリティ上の懸念は何ですか? –

+0

eval()の使い方を簡単に検索して見つけることができます。 – charlietfl