【发布时间】:2016-10-20 22:08:17
【问题描述】:
我需要基于范围变量$scope.isValidationRequired 启用/禁用ng-form="myForm" 下的Angular 表单或子表单中的所有验证规则。因此,如果isValidationRequired 为false,则为指定字段组设置的任何验证都不会运行,结果将始终为myForm.$valid==true,否则,验证规则将照常运行。
我做了很多研究,并意识到这个功能在 Angular 中是不可用的。但是,我发现了一些附加组件或进行了一些自定义,这是可能的。
例如,我可以将附加组件 angular-conditional-validation(github 和 demo)与自定义指令 enable-validation="isValidationRequired" 一起使用。这将是完美的,除了我不能将此功能应用于ng-form 下的一组字段。我必须为每个适用的字段添加此指令。
另一种解决方案是使用 Angular $validators 管道进行自定义验证。这需要一些额外的努力,而且我没有时间,因为 sprint 快结束了,我必须在几天内给出一些结果。
如果您有任何其他建议,请发布答案。
用例:
为了阐明这一点,我将提到用例。最终用户可以用无效数据填写表单,他可以单击Save 按钮,在这种情况下,不应该触发验证规则。只有当用户点击Validate and Save 时才会触发验证规则。
解决方案:
查看最终的 plunker 代码 here。
更新:根据下面的 cmets,如果在 ng-form 下使用内部子表单,该解决方案将导致浏览器挂起。需要更多的努力来调试和解析这个发行者。如果只使用一个级别,那么它工作正常。
更新:plunker here 已更新为更通用的解决方案。现在代码将使用在ng-form 下具有子表单的表单。函数setAllInputsDirty() 检查对象是否为$$parentForm 以停止递归。此外,changeValidity() 将使用$addControl 检查对象是否为表单,然后它将调用自身来验证其子对象。到目前为止,这个函数运行良好,但它需要一些额外的优化。
【问题讨论】:
标签: angularjs forms validation nested subforms