О, Боже мой! Я сделал это! Посмотрите :)
Конечно, это решение не идеально. И это зависит от имени переменной, используемого в контроллере. Но это работает!
Живой пример на 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"
}];})
И директива ЯШ:
.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;})
Можете ли вы изменить свой сервис. ? –
Я могу, если понадобится. Что ты предлагаешь? – Chen