2016-06-29 78 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