当前位置: 首页 > 面试题库 >

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

闻人伟
2023-03-14
问题内容

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

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

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

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


问题答案:

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

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

由于如果您使用Google“ AngularFormValidation”,这是最好的结果之一,所以我想为从那里来的任何人添加另一个答案。

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它可能preferrable替换ng-ifng-show上述

这是强制性的链接

另外,我已经写了一些关于该主题的博客条目,其中涉及了更多细节:

角度形式验证

自定义验证指令

编辑:在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">
      <input type="email" name="email" ng-model="person.email" required/>

      <div ng-messages="personForm.email.$error">
        <div ng-message="required">required</div>
        <div ng-message="email">invalid email</div>
      </div>
    </form>

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

还有一个ngMessages示例的插件



 类似资料:
  • 在中有一个方法,但它看起来不像是一个公共API,所以我宁愿不使用它。创建自定义指令并使用看起来是另一种选择,但基本上需要为每个自定义验证规则创建一个指令,而我不希望这样做。 实际上,在最简单的场景中,将控制器中的某个字段标记为无效(同时保持同步)可能是我完成任务所需要的,但我不知道如何做到这一点。

  • 问题内容: 我有一个带有开始和结束日期范围的Django模型。我想强制执行验证,以便没有两个记录具有重叠的日期范围。最简单的实现方式是什么,这样我就不必重复编写逻辑了? 例如,我不想在Form 和 a 以及 admin表单中重新实现此逻辑, 并且 模型被重写。 据我所知,Django在全球范围内强制执行这些类型的条件并不容易。 Googling并不是很有帮助,因为“模型验证”通常是指验证特定的模型

  • 问题内容: 我有一个看起来像这样的表格: 它的设置使得输入数据后所有必填字段和“保存”按钮都可以使用。但是,部分验证是,我将使用输入的数据使用$ http通过POST通过服务器访问服务器。 我应该在函数中放置该逻辑还是有一个更好的放置位置? 更新: * 我实现了以下内容,将其作为元素上的属性应用,但它在每次我不喜欢的按键上调用服务器/数据库: 问题答案: 您不需要在指令中发出$ http请求,更好

  • 我有一个使用Express-openapi-validator的Node应用程序,它接受一个api规范文件(这是一个. yml文件),带有请求和响应验证。Express-openapi-validator包将请求路由到处理程序文件(在规范中定义)。这是其中一个处理程序可能的样子: 我有一个API密钥特性,用户可以获得一个新的API密钥,其他endpoint需要调用方在请求头中有API密钥来验证请求

  • 我使用Dropwizard Metrics library记录我的应用程序中各种操作的时间,使用计时器和控制台报告器,并将计数、平均速率等记录到控制台fine。 我希望这些数字也可以在 /metricsservlet上使用,并且基于http://metrics.dropwizard.io/3.1.0/manual/servlets/我需要访问名为的Metric注册表。但是查看文档和代码,我看不到是

  • 问题内容: 如何添加自定义CSS文件?以下配置对我不起作用: 结果: 问题答案: 一种简单的方法是将其添加到您的: 然后将文件放入文件夹。