【问题标题】:Validation of invisible and disabled fields in AngularJS验证 AngularJS 中的不可见和禁用字段
【发布时间】:2014-03-04 11:28:07
【问题描述】:

有没有办法在 AngularJS 中进行条件验证?我要解决的问题基本上是基于选择启用/禁用输入的单选按钮列表。下图描述了这个问题。第一个文本输入只接受字母,第二个只接受数字。两者都有ng-patternng-required 设置。 (The working example on Plunker)

我想实现的是,选择单选按钮时,验证关闭了相应的输入字段。

我曾希望将 ng-disabled 设置为 true 可以防止为相关表单控件设置无效状态,但可惜,事实并非如此。

到目前为止,我发现的唯一解决方案是在选择另一个选项并将 ng-required 设置为 false 时清除输入。是否有任何明智的方法可以实现这一点,或者是唯一将元素完全从 DOM 中取出的解决方案?

【问题讨论】:

  • 这不是在 AngularJS 中的一流支持下实现的,这是对现实世界表单验证的一个重大疏忽。

标签: forms angularjs validation


【解决方案1】:

正如 marmite 所暗示的,ng-required 可以接受一个表达式,所以你可以说类似

<input name="numeric" ng-required="alpha.disabled == false" />
<input name="alpha" ng-required="numeric.disabled == false" />

我不确定如何检查禁用状态 - 应该这样做,但我只通过检查复选框的状态来创建此效果。

我知道这是 Lazarus 的帖子,但希望它能帮助其他人。

【讨论】:

  • ng-required 不是字段的唯一验证,模式也应该被禁用。我想要的是在未选中时关闭该字段的所有验证,而不仅仅是需要验证。
  • 天哪——这让事情变得复杂了。我所做的是使用 ng-if 从 DOM 中删除不是当前的字段,因此它们不会得到验证,但如上所述,这需要一个使表单复杂化的复选框。它可能不适合您的预期用户体验,但可以正常工作。
【解决方案2】:

我认为您错误地使用了 ng-required。对于两个文本输入,您已将其硬编码为 true,但实际上这些输入的 ng-required 仅应在选中单选按钮时设置为 true。

【讨论】:

    【解决方案3】:

    试试这个指令:

    .directive('disableChildren', function() {
      return {
        require: '^form',
        restrict: 'A',
        link: function(scope, element, attrs,form) {
          var control;
    
          scope.$watch(function() {
            return scope.$eval(attrs.disableChildren);
          }, function(value) {
            if (!control) {
              control = 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);
            }
          });
        }
      }
    })
    

    DEMO

    有关其工作原理的更多信息和说明。查看我在验证中排除隐藏元素的类似指令:

    implementing a directive to exclude a hidden input element from validation ($addControl issue)

    我认为我们可以以某种方式组合这些指令来创建一个通用指令,该指令可以在任何地方使用,具体取决于我们评估表达式的方式。

    【讨论】:

    • 是的,$addControl$removeControl 可能可以解决问题。我将尝试草拟一个可以禁用所有孩子验证的 plunk。这里的问题是ng-form 可能在disable-children 和要禁用的输入之间的某个位置,以及不拾取select 元素。
    • @RJo:是的,这只是您的案例的演示,只是为了给出$addControl$removeControl 的想法。你可以扩展它。编码愉快。
    • @KhanhTO man 你能帮我吗:stackoverflow.com/q/32052991/1260751
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多