我有一个有几个字段的表单,但是select和input字段耦合在一起:输入的验证取决于用户在select字段中选择的值。
我将试着用一个例子来澄清。假设选择包含行星名称:
<select id="planet" class="form-control" name="planet" ng-model="planet" ng-options="c.val as c.label for c in planets"></select>在输入中,我通过一个名为“输入验证”的自定义指令应用自定义验证:
<input id="city" input-validation iv-allow-if="planet==='earth'" class="form-control" name="city" ng-model="city" required>如果这是指令:
.directive('inputValidation', [function() {
return {
require: 'ngModel',
restrict: 'A',
scope: {
ivAllowIf: '='
},
link: function(scope, elm, attrs, ctrl) {
ctrl.$parsers.unshift(function(viewValue) {
//input is allowed if the attribute is not present or the expression evaluates to true
var inputAllowed = attrs.ivAllowIf === undefined || scope.$parent.$eval(attrs.ivAllowIf);
if (inputAllowed) {
ctrl.$setValidity('iv', true);
return viewValue;
} else {
ctrl.$setValidity('iv', false);
return undefined;
}
});
}
};
}]) 完整的示例可以在Plnkr:http://plnkr.co/edit/t2xMPy1ehVFA5KNEDfrf?p=preview中检查。
无论何时修改select,我都需要再次验证输入。这在我的代码中是不会发生的。我做错了什么?
发布于 2015-08-16 16:28:31
我也做过同样的事情来验证开始日期更改结束日期.在开始日期的指令中,添加监视结束日期的更改,然后在定义结束日期新值的情况下调用ngModel.$validate()。
scope.$watch(function () {
return $parse(attrs.endDate)(scope);
}, function () {
ngModel.$validate();
});重要的部分是在指令中调用ngModel.$validate()。
备注您应该使用$validators进行上述自定义验证才能工作。在这里读,$parsers是旧的方式-从angularjs1.3使用$validators
固定柱塞连杆
https://stackoverflow.com/questions/32037229
复制相似问题