美文网首页
validator相关的指令

validator相关的指令

作者: yb_剑笙 | 来源:发表于2016-09-19 22:08 被阅读0次

    概述

    数据输入有效性校验相关的指令一共有四个,实际是八个(每一个指令都有一个ng开头的同名指令):

    指令 说明
    required,ng-required 必须有输入
    pattern,ng-pattern 正则或函数进行校验
    minlength,ng-minlength 最小长度控制
    maxlength,ng-maxlength 最大长度控制

    这个指令必须依赖ng-model,如果没有设置ng-model,就不会有任何动作。

    实现细节

    四个指令的实现细节基本上是一模一样的:
    1、设置controller的校验回调函数。
    2、监控对应的属性,如果数据发生变化,就调用model controller的$validate进行有效性校验。
    以required为例:

    ctrl.$validators.required = function(modelValue, viewValue) {
      return !attr.required || !ctrl.$isEmpty(viewValue);
    };
    
    attr.$observe('required', function() {
      ctrl.$validate();
    });
    
    指令 回调函数名称
    required,ng-required $validators.required
    pattern,ng-pattern $validators.pattern
    maxlength,ng-maxlength $validators.maxlength
    minlength,ng-minlength $validators.minlength

    四个指令对应的校验回调:

    指令 回调函数名称
    required,ng-required $validators.required
    pattern,ng-pattern $validators.pattern
    maxlength,ng-maxlength $validators.maxlength
    minlength,ng-minlength $validators.minlength

    这些回调会在ng-model中调用:

    function processSyncValidators() {
      var syncValidatorsValid = true;
      forEach(ctrl.$validators, function(validator, name) {
        var result = validator(modelValue, viewValue);
        syncValidatorsValid = syncValidatorsValid && result;
        setValidity(name, result);
      });
      if (!syncValidatorsValid) {
        forEach(ctrl.$asyncValidators, function(v, name) {
          setValidity(name, null);
        });
        return false;
      }
      return true;
    }
    

    从中可以看出,当需要添加或值修改ng-model的校验方式时,只需要修改$validators的属性就可以了。

    样例代码

    <!DOCTYPE html>
    <html lang="en" ng-app="app">
    <!--<html>-->
    <head>
        <title>Test</title>
    </head>
    <body>
         <div ng-controller="ExampleController">
             <form name="form">
                 <label for="required">Toggle required: </label>
                 <input type="checkbox" ng-model="required" id="required" />
                 <br>
                 <label for="input">This input must be filled if `required` is true: </label>
                 <input type="text" ng-model="model" id="input" name="input" ng-required="required" /><br>
                 <hr>
                 required error set? = <code>{{form.input.$error.required}}</code><br>
                 model = <code>{{model}}</code>
             </form>
             </div>
    <script src="./node_modules/angular/angular.js" type="text/javascript"></script>
    <script>
        angular.module('app', [])
                .controller('ExampleController', ['$scope', function ($scope) {
                    $scope.required = true;
                }]);
    </script>
    </body>
    </html>
    

    这段代码实现了一个控制输入框的required属性的功能,可以看到required属性为treu和false时输入框为空时的数据变化。

    相关文章

      网友评论

          本文标题:validator相关的指令

          本文链接:https://www.haomeiwen.com/subject/otbnettx.html