我有一个需要验证的表单.
表单包含许多部分,默认情况下会禁用其中一些部分.每个字段中的值都是正确的,但它违反了我的验证指令.例如,当它禁用时它应该包含0,但是当它可编辑时它应该包含其他内容.无论如何,我附加一个禁用指令给他们,并把它们放下.
当我提交表单(使用角度范围函数)时,if ($scope.sarfaslForm.$invalid)- >返回true.它说我检查$scope.sarfaslForm.$error列表时有两个无效字段.
在此博客之后,我实施了我的验证:http: //blog.yodersolutions.com/bootstrap-form-validation-done-right-in-angularjs/
在这个线程之后,我创建了一个指令来忽略我的一些禁用控件:
我对这个指令做了一个小改动:
.directive('hsDisableValidation', function() {
return {
require: '^form',
restrict: 'A',
link: function(scope, element, attrs,form) {
var control;
scope.$watch(function() {
return scope.$eval(attrs.hsDisableValidation);
}, function(value) {
if (!control) {
control = form[element[0].name];
//form[element.find("input").attr("name")];
}
if (value === false) {
form.$addControl(control);
angular.forEach(control.$error, function(validity, validationToken) {
form.$setValidity(validationToken, !validity, control);
});
} else {
form.$removeControl(control);
//In Here: I tried to $setValidity of controls to true, Remove Error List, and …Run Code Online (Sandbox Code Playgroud) 我正在创建一个指令来从验证中排除隐藏的输入元素:http://plnkr.co/edit/Vnwvq2AT7JpgTnoQwGh9?p = preview
app.directive('shownValidation', function() {
return {
require: '^form',
restrict: 'A',
link: function(scope, element, attrs,form) {
var control;
scope.$watch(attrs.ngShow,function(value){
if (!control){
control = form[element.attr("name")];
}
if (value == true){
form.$addControl(control);
}else{
form.$removeControl(control);
}
});
}
};
});
Run Code Online (Sandbox Code Playgroud)
这里的想法是如果元素被隐藏,我将从表单中删除控件,以便它不会影响其他输入有效性.它在我打电话时工作正常 form.$removeControl(control);,您可以在演示中通过删除名字并单击按钮来隐藏字段来测试它.
但是当我再次单击该按钮时,即使名字无效(空),表单有效性仍然为真
我也尝试添加form.$setValidity(form.$valid && control.$valid)=>有效状态按预期更新,但是当我输入第一个名称时,有效性仍然是假的.
我的问题是如何解决这个问题?谢谢你的回复.
更新:
感谢@ Michael的回答.这是工作解决方案:
app.directive('shownValidation', function() {
return {
require: '^form',
restrict: 'A',
link: function(scope, element, attrs, form) {
var control;
scope.$watch(attrs.ngShow, function(value) {
if (!control) {
control = …Run Code Online (Sandbox Code Playgroud)