2016-06-29 20 views
0

注意:類似於:angularjs execute expression from variable除了我不希望混淆我的範圍以及使用的所有可能性和數據集。AngularJS從字符串中的表達式

我希望能夠在Angular的表達式中使用預先確定的公式。

例子:

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> 

formulaValue公式,如果我鍵入它喜歡被評價:

<div ng-repeat="item in myArray"> 
    <span>{{item['propertyOne'] + item['propertyTwo']}}</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; 

把帽子戴上,在一個服務,你的配置但現在只會放在示波器上。

考慮將類似

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

如果是我,我寧願看着像

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

一個配置,那麼你會檢查formulaType做什麼,需要與特性在公式值中不使用eval()

+0

'$ parse'在這裏可能很好。 –

+0

在某些情況下,我可能最終不得不使用eval來執行更復雜的操作,但是具有公式類型和定製一些函數來處理每種類型不會太糟糕。但是,我可能最終不得不評估一些公式。如果我完全控制了配置,在這種情況下eval的安全性問題是什麼? –

+0

易於搜索和找到很多關於使用eval()。 – charlietfl