我需要根据服务返回的表达式动态显示子总数。请参阅下面的示例项结构。属性值绑定到文本输入。如果任何输入值更改,则根据标签中的表达式更新子总计。最好的方法是什么?
注意:fieldname / Value对的数量可以变化。
$scope.item = [
{fieldName: "fname1", value: 2},
{fieldName: "fname2", value: 5},
{fieldName: "fname3", value: 4},
{fieldName: "fname4", value: 6},
{fieldName: "fname5", value: 3},
{fieldName: "subTotal1", expression: "['fname1'] + ['fname2'] +['fname3'] +['fname4'] +['fname5'] +"}
]

答案 0 :(得分:1)
当然,这个解决方案并不完美。它取决于控制器中使用的变量名称。但它有效!
jsfiddle上的实例。
<form name="ExampleForm" id="ExampleForm">
<div ng-repeat="item in items">
<div ng-if="item.fieldName!='subTotal1'">
<input ng-model="item.value">
<my-ng-model n-name="{{item.fieldName}}" n-value="item.value" obj="obj"></my-ng-model>
</div>
<div ng-if="item.fieldName=='subTotal1'">
{{item.expression }}={{$eval(item.expression)}}
</div>
</div>
{{obj|json}}
</form>
和js控制器:
.controller('ExampleController', function($scope, $parse) {
$scope.obj = {};
$scope.items = [{
fieldName: "fname1",
value: 2
}, {
fieldName: "fname2",
value: 5
}, {
fieldName: "fname3",
value: 4
}, {
fieldName: "fname4",
value: 6
}, {
fieldName: "fname5",
value: 3
}, {
fieldName: "subTotal1",
expression: "obj.fname1 + obj.fname2 +obj.fname3 +obj.fname4 +obj.fname5"
}];})
和js指令:
.directive('myNgModel', function() {
var root = {
restrict: "E",
replace: true,
scope: {
nName: "@",
nValue: "=",
obj: "="
},
template: '<div></div>',
link: function(scope) {
scope.obj[scope.nName] = scope.nValue*1;
scope.$watch('nValue', function(value) {
scope.obj[scope.nName] = value*1;
});
}
}
return root; })
<强>已更新强>
现在它的工作没有引用局部变量!
jsfiddle上的实例。
<form name="ExampleForm" id="ExampleForm">
<div ng-repeat="item in items">
<div ng-if="item.fieldName!='subTotal1'">
<input ng-model="item.value">
<my-ng-model n-name="{{item.fieldName}}" n-value="item.value" obj="obj"></my-ng-model>
</div>
</div>
<div ng-repeat="eval in evals">
{{eval.expression }}={{$eval(eval.expression,obj)}}
</div>
</form>
控制器
.controller('ExampleController', function($scope, $parse) {
$scope.obj = {};
$scope.items = [{
fieldName: "fname1",
value: 2
}, {
fieldName: "fname2",
value: 5
}, {
fieldName: "fname3",
value: 4
}, {
fieldName: "fname4",
value: 6
}, {
fieldName: "fname5",
value: 3
}, {
fieldName: "subTotal1",
expression: "fname1 + fname2 +fname3 +fname4 +fname5"
}];
$scope.evals = [];
angular.forEach($scope.items, function(item) {
if (item.expression) {
$scope.evals.push({
expression: item.expression
});
}
});})
指令
.directive('myNgModel', function() {
var root = {
restrict: "E",
replace: true,
scope: {
nName: "@",
nValue: "=",
obj: "="
},
link: function(scope) {
scope.obj[scope.nName] = scope.nValue * 1;
scope.$watch('nValue', function(value) {
scope.obj[scope.nName] = value * 1;
});
}
}
return root;})
答案 1 :(得分:0)
如果需要根据expresion
属性计算值,则应首先将字段指示符与表达式中的数学运算符一起使用。此过程的复杂性因您在表达式中允许的数学印象类型而异。
例如:
[fName1] + [fName2] - [fName3] // is a simple expression
[fName1] * ([fName2] + [fName3]) // is complex than that
然后,您应该通过将这些标记与数组进行比较来计算这些标记的聚合值。
-
如果表达式来自用户,我不推荐的一种替代方法是创建一个私有范围对象,其中包含所有这些fName变量,并对该上下文使用eval
函数通过抽象。
您可以在this回答中了解此方法。
答案 2 :(得分:0)
我写了一个小提琴来解决你的问题。它可以改善,但我现在没有时间。你可以自己做。
它基于您发布的模型:
$scope.item = [
{fieldName: "fname1", value: 2},
{fieldName: "fname2", value: 5},
{fieldName: "fname3", value: 4},
{fieldName: "fname4", value: 6},
{fieldName: "fname5", value: 3},
{fieldName: "subTotal1", expression: "['fname1'] + ['fname2'] +['fname3'] +['fname4'] +['fname5'] +"}
]
对于绑定工作,您可以将所有内容放在属性更改时重新评估的函数中。
查看HERE