如何在指令中访问Angular表单验证

时间:2014-04-23 07:54:41

标签: angularjs validation angularjs-directive

我有一个带有指令的简单表格:

<form name="testform">
    <input name="testfield" type="text" ng-model="test.name" ng-minlength="3" my-validate>
</form>

由于Angular在输入少于3个字符时验证字段本身,因此设置testform.testfield.$invalid

我想要实现的是在指令中添加一些自定义验证功能,对此角度验证做出反应/设置验证结果,例如在观察者或类似事件的帮助下:

angular.module('myApp.directives').directive('myValidate', [function() {
    return {
        link: function(scope, elem, attrs) {
            elem.on('keyup', function() {
                // do some custom validation
                // if valid, set elem to $valid
                // else set $error
                // something like elem.set('$valid');
            }
        }
    };
}]);

如何在使用Angulars testform.testfield.$invalidtestform.testfield.$validtestform.testfield.$error等逻辑时实现HTML5,Angular和自定义表单验证的组合?

2 个答案:

答案 0 :(得分:2)

默认情况下,Angular提供了一些输入验证指令(如required,pattern,min,max等)。如果这些指令不够,可以使用自定义验证。为了能够做到这一点,该指令需要用于验证的模型,然后它可以设置元素的有效性,如下所示:

.directive('myValidate', [ function() {
    return {
        require: 'ngModel',
        link: function(scope, elem, attrs, ctrl) {
            ctrl.$setValidity('myValidate', false);
        }
    };
}]);

具有此类指令的Plunker,当您输入&#39; 0&#39;是HERE

您可以在Angular forms documentation上阅读有关自定义验证的详情。

答案 1 :(得分:1)

您可以进行自定义验证并将其与Angular内置验证相结合,您只需要要求ngModel,将ctrl作为第4个值传递给您的链接函数,并使用ctrl。$ setValidity来指示您的自定义验证通过或失败。

如果长度&lt;以下示例将无效。 3或者如果值是字符串&#39;无效&#39;:

var app = angular.module('app', []);

app.controller('controller', ['$scope',
  function(scope) {
    scope.test = {
      name: ''
    };
  }
]);

app.directive('myValidate', [
  function() {
    return {
      require: 'ngModel',
      link: function(scope, elem, attrs, ctrl) {
        ctrl.$parsers.unshift(function(value) {
          var valid = true;
          if (value === 'invalid') {
            valid = false;
          }
          ctrl.$setValidity(attrs.name, valid);
          return valid ? value : undefined;
        });
      }
    };
  }
]);

标记:

<body ng-app="app">
    <div ng-controller="controller">
      <form name="testform">
        <input name="testform" type="text" ng-model="test.name" ng-minlength="3" my-validate /><br/>

      </form>
      <span style="color:green" ng-show="testform.testform.$valid">** valid **</span>
      <span style="color:red" ng-show="testform.testform.$invalid">** invalid **</span>
    </div>
    <script src="script.js"></script>
  </body>

以下是使用此代码的plunker:http://plnkr.co/edit/6XIKYvGwMSh1zpLRbbEm

Angular文档谈到了这一点,虽然它并不是很明显:https://docs.angularjs.org/api/ng/type/ngModel.NgModelController

此博客帮助我抓住了这个问题:http://www.benlesh.com/2012/12/angular-js-custom-validation-via.html