次の(非常に単純な)データ構造があるとしましょう:
$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の適切なソースを見つけることができませんでした.
編集:次のカスタムディレクティブを思いつきました(「共有」は元のコードの「パーセント」と同義です)。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 はまだ無効です。アイデア?