小编典典

如何向 AngularJS 表单添加自定义验证?

all

required通过添加属性等,我有一个带有输入字段和验证设置的表单。但对于某些领域,我需要做一些额外的验证。我将如何“利用”控制的验证FormController

自定义验证可能类似于“如果填写了这 3 个字段,则此字段是必需的并且需要以特定方式格式化”。

有一个方法,FormController.$setValidity但它看起来不像公共
API,所以我宁愿不使用它。创建自定义指令并使用NgModelController看起来像是另一种选择,但基本上需要我为每个自定义验证规则创建一个指令,这是我不想要的。

实际上,将控制器中的字段标记为无效(同时保持FormController同步)可能是我在最简单的情况下完成工作所需要的,但我不知道该怎么做。


阅读 135

收藏
2022-05-04

共1个答案

小编典典

编辑:在下面添加了有关 ngMessages ( >= 1.3.X) 的信息。

标准表单验证消息(1.0.X 及更高版本)

由于如果您使用 Google“Angular 表单验证”,这是最好的结果之一,目前,我想为从那里进来的任何人添加另一个答案。

FormController.$setValidity 中有一个方法,但它看起来不像公共 API,所以我宁愿不使用它。

这是“公开的”,不用担心。用它。这就是它的用途。如果不打算使用它,Angular 开发人员会在闭包中将其私有化。

要进行自定义验证,如果您不想像其他答案所建议的那样使用 Angular-UI,您可以简单地滚动您自己的验证指令。

app.directive('blacklist', function (){ 
   return {
      require: 'ngModel',
      link: function(scope, elem, attr, ngModel) {
          var blacklist = attr.blacklist.split(',');

          //For DOM -> model validation
          ngModel.$parsers.unshift(function(value) {
             var valid = blacklist.indexOf(value) === -1;
             ngModel.$setValidity('blacklist', valid);
             return valid ? value : undefined;
          });

          //For model -> DOM validation
          ngModel.$formatters.unshift(function(value) {
             ngModel.$setValidity('blacklist', blacklist.indexOf(value) === -1);
             return value;
          });
      }
   };
});

这是一些示例用法:

<form name="myForm" ng-submit="doSomething()">
   <input type="text" name="fruitName" ng-model="data.fruitName" blacklist="coconuts,bananas,pears" required/>
   <span ng-show="myForm.fruitName.$error.blacklist">
      The phrase "{{data.fruitName}}" is blacklisted</span>
   <span ng-show="myForm.fruitName.$error.required">required</span>
   <button type="submit" ng-disabled="myForm.$invalid">Submit</button>
</form>

注意:在 1.2.X 中,它可能更适合ng-if替换ng-show上面

这是一个强制性的plunker 链接

此外,我还写了一些关于这个主题的博客文章,其中包含更多细节:

角度表单验证

自定义验证指令

编辑:在 1.3.X 中使用 ngMessages

您现在可以使用 ngMessages 模块而不是 ngShow 来显示错误消息。它实际上可以与任何东西一起使用,它不一定是错误消息,但这里是基础知识:

  1. 包括<script src="angular-messages.js"></script>
  2. ngMessages在您的模块声明中引用:

    var app = angular.module('myApp', ['ngMessages']);
    
  3. 添加适当的标记:

    <form name="personForm">
    


    required

    invalid email


在上面的标记中,基本上为子指令ng-message="personForm.email.$error"指定了一个上下文。ng-message然后
在该上下文ng-message="required"ng-message="email"指定要观察的属性。
最重要的是,他们还指定了签入的顺序 。它在列表中找到的第一个“真实”的获胜,它将显示该消息而不显示其他消息。

还有一个ngMessages 示例的
plunker

2022-05-04