Angularjs 在父值更改后验证依赖值列表
使用角度1.5+ 这是我的剧本。。。我有一个基本字段,称之为“基本”。 然后我得到了一个字段列表,需要是该基数的倍数,我使用$validator来实现这一点。。。一个简单的模数检查 我可以验证每个字段。。。因此,如果我突出显示列表中的一个字段并更改其值,它将正确激发和验证 我需要的是能够更改“基本”值并重新评估所有孩子。我已经研究了很多角度稍有不同的问题,这些问题都很相似,但在这个特殊的案例中,似乎没有一个对我有帮助 这样的观点:Angularjs 在父值更改后验证依赖值列表,angularjs,Angularjs,使用角度1.5+ 这是我的剧本。。。我有一个基本字段,称之为“基本”。 然后我得到了一个字段列表,需要是该基数的倍数,我使用$validator来实现这一点。。。一个简单的模数检查 我可以验证每个字段。。。因此,如果我突出显示列表中的一个字段并更改其值,它将正确激发和验证 我需要的是能够更改“基本”值并重新评估所有孩子。我已经研究了很多角度稍有不同的问题,这些问题都很相似,但在这个特殊的案例中,似乎没有一个对我有帮助 这样的观点: <div ng-controller="myAppCont
<div ng-controller="myAppController as app" >
<input type="text" ng-model="app.base" >
<br><br>
are these multiples of above?
<br><br>
<div ng-repeat="v in app.values">
<input type="text" ng-model="v.value" multiple-of="{{app.base}}" />
</div>
var app = angular.module('myApp', []);
app.controller('myAppController', function myAppController($filter) {
var self = this;
self.base = 10;
self.values = [
{value: 10},
{value: 20},
{value: 30},
{value: 40},
{value: 50}];
});
对于值列表,使用如下验证程序:
app.directive('multipleOf', function () {
return {
require: 'ngModel',
link: function (scope, elm, attrs, ngModel) {
ngModel.$validators.multipleOf = function (modelValue, viewValue) {
var value = parseInt(modelValue);
var base = parseInt(attrs.multipleOf);
var valid = value >= base && value % base === 0;
return valid;
};
}
};
});
在这个特定的设置中,如果我将base更改为20,那么20和40的列表值应该是有效的,但是现在其他三个值应该是无效的。当基值更改时,如何触发此级联验证
Plunkr:我已编辑了您的plunker,使其正常工作: 这不是我写的最好的代码,但它将解释基本原理,因为现在指令不能像预期的那样重用
app.directive('multipleOf', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ngModel) {
scope.myForm.base.$viewChangeListeners.push(function() {
scope.myForm.value10.$validate();
scope.myForm.value20.$validate();
scope.myForm.value30.$validate();
scope.myForm.value40.$validate();
scope.myForm.value50.$validate();
});
ngModel.$validators.multipleOf = function(modelValue, viewValue) {
if (scope.myForm.base.$modelValue && scope.myForm.base.$modelValue >= 0) {
var value = modelValue || 0;
var base = parseInt(scope.myForm.base.$modelValue);
var valid = value >= base && value % base === 0;
return valid;
}
};
}
};
});
但是,如果您希望在更改一个字段后验证其他字段,则需要添加$viewChangeListeners。我希望它能解决你的问题。找到了解决办法
首先,与其在视图中计算基表达式,不如将属性作为字符串传入
<div ng-controller="myAppController as app" >
<input type="text" ng-model="app.base" >
<br><br>
are these multiples of above?
<br><br>
<div ng-repeat="v in app.values">
<input type="text" ng-model="v.value" multiple-of="app.base" />
</div>
修改后的plunkr:感谢您的回复。。。它让我朝着正确的方向发展,但我发现了一个更优雅的解决方案,我发布了这个解决方案。这种优雅值得商榷。你知道,输入inputfiels的$eval是一个很大的安全风险。您输入的所有内容都将被javascript代码执行。它不会对字段值本身执行$eval。。。它使用$eval获取属性的值。它基本上是说“给我app.base的值”…这是安全的。这使得指令更有用。但仍然发现这是一个短转弯,感觉不对劲。
app.directive('multipleOf', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ngModel) {
ngModel.$validators.multipleOf = function(modelValue, viewValue) {
var value = parseInt(modelValue);
var base = parseInt(scope.$eval(attrs.multipleOf));
var valid = value >= base && value % base === 0;
return valid;
};
scope.$watch(attrs.multipleOf, function() {
ngModel.$validate();
})
}
};
});