Скажем, у меня есть следующая (очень простая) структура данных:
$scope.accounts = [{
percent: 30,
name: "Checking"},
{ percent: 70,
name: "Savings"}];
Тогда у меня есть следующая структура как часть формы:
<div ng-repeat="account in accounts">
<input type="number" max="100" min="0" ng-model="account.percent" />
<input type="text" ng-model="account.name" />
</div>
Теперь я хочу проверить, что сумма процентов равна 100 для каждого набора учетных записей, но большинство примеров, которые я видел в пользовательских директивах, относятся только к проверке отдельного значения. Что такое идиоматический способ создания директивы, которая могла бы одновременно проверять несколько зависимых полей? В jquery существует множество решений для этого, но я не смог найти хороший источник для Angular.
EDIT: я придумал следующую настраиваемую директиву ( "share" - синоним исходного кода "percent" ).
Директива share-validate берет карту формы "{group: accounts, id: $index}"
как ее значение.
app.directive('shareValidate', function() {
return {
restrict: 'A',
require: 'ngModel',
link: function(scope, elem, attr, ctrl) {
ctrl.$parsers.unshift(function(viewValue) {
params = angular.copy(scope.$eval(attr.shareValidate));
params.group.splice(params.id, 1);
var sum = +viewValue;
angular.forEach(params.group, function(entity, index) {
sum += +(entity.share);
});
ctrl.$setValidity('share', sum === 100);
return viewValue;
});
}
};
});
Этот ALMOST работает, но не может обрабатывать случай, когда поле является недействительным, но последующее изменение в другом поле делает его действительным снова. Например:
Field 1: 61
Field 2: 52
Если я возьму поле 2 до 39, поле 2 теперь будет действительным, но поле 1 все еще недействительно. Идеи?