gpt4 book ai didi

forms - 实现指令以从验证中排除隐藏的输入元素($addControl 问题)

转载 作者:行者123 更新时间:2023-12-03 06:48:50 24 4
gpt4 key购买 nike

我正在创建一个指令以从验证中排除隐藏的输入元素: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);
}
});
}
};
});

这里的想法是,如果元素被隐藏,我将从表单中删除该控件,这样就不会影响其他输入的有效性。当我调用 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 = form[element.attr("name")];
}
if (value == true) {
form.$addControl(control);
//Add a forEach to manually update form validity.Thanks to @Michael's answer
angular.forEach(control.$error, function(validity, validationToken) {
form.$setValidity(validationToken, !validity, control);
});
} else {
form.$removeControl(control);
}
});
}
};
});

Working plunk

最佳答案

如果控件被删除, Angular 更新有效性(来自源):

  form.$removeControl = function(control) {
if (control.$name && form[control.$name] === control) {
delete form[control.$name];
}
forEach(errors, function(queue, validationToken) {
form.$setValidity(validationToken, true, control);
});

arrayRemove(controls, control);
};

如果添加控制 Angular 没有更新有效性(来自来源):

  form.$addControl = function(control) {
// Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
// and not added to the scope. Now we throw an error.
assertNotHasOwnProperty(control.$name, 'input');
controls.push(control);

if (control.$name) {
form[control.$name] = control;
}
};

所以我们必须手动执行此操作。我想是这样的:

if (value == true){
form.$addControl(control);
angular.forEach(control.$error, function(validity, validationToken) {
form.$setValidity(validationToken, !validity, control);
});
}else{
form.$removeControl(control);
}
}

关于forms - 实现指令以从验证中排除隐藏的输入元素($addControl 问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21575051/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com