- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个指令以从验证中排除隐藏的输入元素: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);
}
});
}
};
});
最佳答案
如果控件被删除, 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/
我正在我的项目中使用 getx,我正在尝试使用 getx 依赖注入(inject)。我创建 AddBinding 类: class AddBinding implements Bindings {
我正在创建一个指令以从验证中排除隐藏的输入元素:http://plnkr.co/edit/Vnwvq2AT7JpgTnoQwGh9?p=preview app.directive('shownVali
我正在使用 Angular 1.0.8。如何正确添加已编译的表单元素?我认为它与如何使用 $addControl 有关? 考虑这个例子:http://jsfiddle.net/lesouthern/L
嵌套表单,尝试在其他表单中添加一个表单,但出现错误“无法读取 null 的属性 'addControl'”。 FormGroupDirective 似乎没有返回父“表单”。尝试应用子表单方法进行嵌套。
我有一个 ASP.NET Core 3.0 项目在以下启动时运行良好: public void ConfigureServices(IServiceCollection services) {
我在浏览 Angular 文档时遇到了 FormController类(class)。我看到有几个方法可以添加和删除控件,即 $addControl() 和 $removeControl()。我假设这
我有一个嵌套的 FormGroup,如下所示: this.formGroup: FormGroup: { // ... controls: { "GENERAL_AND
我有一张传单 map ,它使用 HTML 自定义图例并使用 addControl 函数添加(以下:Leaflet Legend for Custom Markers in R)。 但是,我只希望在显示
当以下代码执行行 services.AddControllers().AddNewtonsoftJson() 时出现问题,它抛出此异常,如果删除该行,则服务执行正常。 Some services ar
我正在制作一个可注入(inject)服务(即使用 IServiceCollection.AddSingleton 添加...),它与自定义全局操作过滤器一起使用。换句话说,我需要添加过滤器: serv
我正在制作一个可注入(inject)服务(即使用 IServiceCollection.AddSingleton 添加...),它与自定义全局操作过滤器一起使用。换句话说,我需要添加过滤器: serv
在 Angular 7 和 ReactiveForm 中,如果我将文件放入 ,然后我添加一行 formgroup.addControl() , 所有 被重置。 我卡住了,因为 type="file"
我有一个添加不同字段的来源(我正在添加新控件,因为只是使用 *ngIf 将它们从模板中隐藏不会将它们从表单中排除,因此导致表单无效)基于选择选项中的所选选项.我正在使用 Angular2 中表单的 a
我已经使用 android 制作了一个天气 API 网络应用程序, 链接:- https://stackblitz.com/edit/maximlweatherapp 应用程序网址:- https:/
我们最近从 ng 7.2.15 和 typescript 3.2.4 升级到了 angular v8.2.14 和 typescript v3.5.3。 将表单组从父组件传递到子组件不再有效。 下面是
我是一名优秀的程序员,十分优秀!