AngularJS中使用的表单验证(转)

(译) AngularJS中使用的表单验证

 

客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可让你从一开始就写出一个具备交互性和可相应的现代HTML5表单。css

在AngularJS中,有许多表单验证指令。在这里,咱们将谈谈几个最流行指令,而后咱们将讨论如何编写自定义的验证。html

<form name="form">
  <label name="email">Your email</label>
  <input type="email" name="email" ng-model="email" placeholder="Email Address" />
</form>

AngularJS使得咱们能够在不用额外努力的状况下轻松的处理客户端表单验证。虽然咱们不能仅靠客户端验证来保持咱们的Web应用程序的安全性,但他们提供了良好即时反馈到表单上。前端

要使用表单验证,咱们首先必须确保form标签有一个name属性,像上面的例子同样。明白了吗?太好了!git

全部输入字段能够进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5标签的属性验证。github

一般须要在form标签中加上novalidate属性,这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。正则表达式

让咱们来看看咱们能够在input设置哪些验证:数据库

必填

验证是否已输入字符,只需在标签上加上required后端

<input type="text" required />

最小长度

验证输入至少输入{number}个字符,使用AngularJS指令的ng-minlength=“{number}”api

<input type="text" ng-minlength=5 />

最大长度

验证输入字符要小于等于{number}个字符,使用AngularJS指令的ng-maxlength=“{number}”浏览器

<input type="text" ng-maxlength=20 />

正则匹配

要确保输入匹配一个正则表达式,使用AngularJS的指令ng-pattern="/PATTERN/":

<input type="text" ng-pattern="/a-zA-Z/" />

Email

验证输入字符是一个电子邮件地址,只需设定inputtype属性为email,像这样:

<input type="email" name="email" ng-model="user.email" />

数字

验证输入字符是一个数字,一样只需设定inputtype属性为number,像这样:

<input type="number" name="email" ng-model="user.age" />

Url

验证输入字符是一个URL地址,一样只需设定inputtype属性为url,像这样:

<input type="url" name="homepage" ng-model="user.facebook_url" />

自定义验证

AngularJS能够很容易的使用指令来添加自定义验证。例如,咱们要验证咱们的用户名是可用的(在数据库中不重复)。要作到这一点,咱们将实现一个指令,它在输入字符变化时触发一个Ajax请求:

复制代码
var app = angular.module('validationExample', []);

app.directive('ensureUnique', ['$http', function($http) {
  return {
    require: 'ngModel',
    link: function(scope, ele, attrs, c) {
      scope.$watch(attrs.ngModel, function() {
        $http({
          method: 'POST',
          url: '/api/check/' + attrs.ensureUnique,
          data: {'field': attrs.ensureUnique}
        }).success(function(data, status, headers, cfg) {
          c.$setValidity('unique', data.isUnique);
        }).error(function(data, status, headers, cfg) {
          c.$setValidity('unique', false);
        });
      });
    }
  }
}]);
复制代码

验证表单状态

AngularJS将DOM验证的结果保存在$scope对象中。这使咱们可以实时作出一些响应。提供给咱们的属性有:

请注意,这是这个属性的格式:

formName.inputFieldName.property

未修改过的表单

布尔值属性,表示用户是否修改了表单。若是为ture,表示没有修改过;false表示修改过:

formName.inputFieldName.$pristine;

修改的表单

布尔型属性,当且仅当用户实际已经修改的表单。无论表单是否经过验证:

formName.inputFieldName.$dirty

通过验证的表单

布尔型属性,它指示表单是否经过验证。若是表单当前经过验证,他将为true

formName.inputFieldName.$valid

未经过验证的表单

布尔型属性,它指示表单是否经过验证。若是表单当前没有经过验证,他将为true

formName.inputFieldName.$invalid

最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。同时,若是要设置特定的class时,他们也很是有用的。

错误

另外一个有用的属性是AngularJS提供给咱们的$error对象。这个对象包含input的每个验证是有效的仍是无效的(一个集合)。为了访问这个属性,使用下面的语法:

formName.inputfieldName.$error

若是验证失败,则此属性将是true的,而若是它是false的,那么该值经过验证的。

无害的一些样式

当AngularJS处理的表单验证时,它将根据验证的状态增长一些特定的class属性。这些class被命名为相似的属性,咱们能够检查。

这些class是:

.ng-pristine {}
.ng-dirty {}
.ng-valid {}
.ng-invalid {}

这些class对应着其对应的验证对象的结果。

当一个字段是无效的,  .ng-invalid将被应用到这个字段上。咱们能够经过css来设置这些class的样式:

复制代码
input.ng-invalid {
  border: 1px solid red;
}
input.ng-valid {
  border: 1px solid green;
}
复制代码

 

所有放在一块儿

让咱们编写一个注册表单。本申请表单将包括这我的的名字,他们的电子邮件,以及所需的用户名。

 

让咱们定义一个form表单:

复制代码
<form name="signup_form" novalidate ng-submit="signupForm()">
  <fieldset>
    <legend>Signup</legend>

    <button type="submit" class="button radius">Submit</button>
  </fieldset>
</form>
复制代码

这个表单的名字是signup_form ,当咱们点击提交时咱们将调用signupForm()方法.

如今,让咱们添加用户的Name属性:

复制代码
<div class="row">
  <div class="large-12 columns">
    <label>Your name</label>
    <input type="text" 
        placeholder="Name" 
        name="name" 
        ng-model="signup.name" 
        ng-minlength=3 
        ng-maxlength=20 required />
  </div>
</div>
复制代码

 首先我想说明我使用了 Foundation 做为个人css框架,因此你将在代码中看到它的相关语法。 咱们增长了一个名字为name的输入框,而且对象绑定在$scope对象的signup.name对象上(经过ng-model)。

咱们还设置了几个验证。这些验证分别是:咱们必须有一个长度为3个或更多字符的名字。而且最大长度限制为20个字符(21或更多的个字符将是无效的)。最后,咱们设置名称应该是必填的。

当若是表单无效时,让咱们用属性来控制显示仍是隐藏错误列表。咱们还将使用$dirty属性,以确保当用户没有输入字符前错误提示不显示:

复制代码
<div class="row">
  <div class="large-12 columns">
    <label>Your name</label>
    <input type="text" 
        placeholder="Name" 
        name="name" 
        ng-model="signup.name" 
        ng-minlength=3 
        ng-maxlength=20 required />
   <div class="error" 
        ng-show="signup_form.name.$dirty && signup_form.name.$invalid">
    <small class="error" 
        ng-show="signup_form.name.$error.required">
        Your name is required.
    </small>
    <small class="error" 
            ng-show="signup_form.name.$error.minlength">
            Your name is required to be at least 3 characters
    </small>
    <small class="error" 
            ng-show="signup_form.name.$error.maxlength">
            Your name cannot be longer than 20 characters
    </small>
  </div>
  </div>
</div>
复制代码

让咱们来看看接下来的验证,一个电子邮件:

复制代码
<div class="row">          
  <div class="large-12 columns">
    <label>Your email</label>
    <input type="email" 
      placeholder="Email" 
      name="email" 
      ng-model="signup.email" 
      ng-minlength=3 ng-maxlength=20 required />
    <div class="error" 
         ng-show="signup_form.email.$dirty && signup_form.email.$invalid">
      <small class="error" 
             ng-show="signup_form.email.$error.required">
             Your email is required.
      </small>
      <small class="error" 
             ng-show="signup_form.email.$error.minlength">
              Your email is required to be at least 3 characters
      </small>
      <small class="error" 
             ng-show="signup_form.email.$error.email">
             That is not a valid email. Please input a valid email.
      </small>
      <small class="error" 
             ng-show="signup_form.email.$error.maxlength">
              Your email cannot be longer than 20 characters
      </small>
    </div>
  </div>
</div>
复制代码

这一次(包括整个表单),咱们编写电子邮件字段。请注意,咱们设置了input的type属性为email而且添加了$error.email错误信息。这是基于AngularJS的电子邮件验证(使用HTML5的属性)。

最后,让咱们来看看在咱们的最后一个输入框,用户名:

复制代码
<div class="large-12 columns">
  <label>Username</label>
    <input  type="text" 
            placeholder="Desired username" 
            name="username" 
            ng-model="signup.username" 
            ng-minlength=3 
            ng-maxlength=20 
            ensure-unique="username" required />
  <div class="error" ng-show="signup_form.username.$dirty && signup_form.username.$invalid">
    <small class="error" ng-show="signup_form.username.$error.required">Please input a username</small>
    <small class="error" ng-show="signup_form.username.$error.minlength">Your username is required to be at least 3 characters</small>
    <small class="error" ng-show="signup_form.username.$error.maxlength">Your username cannot be longer than 20 characters</small>
    <small class="error" ng-show="signup_form.username.$error.unique">That username is taken, please try another</small>
  </div>
</div>
复制代码

在咱们的最后一个字段,咱们使用咱们以前编写的自定义验证。这个自定义验证使用的AngularJS指令:

复制代码
app.directive('ensureUnique', ['$http', function($http) {
  return {
    require: 'ngModel',
    link: function(scope, ele, attrs, c) {
      scope.$watch(attrs.ngModel, function() {
        $http({
          method: 'POST',
          url: '/api/check/' + attrs.ensureUnique,
          data: {'field': attrs.ensureUnique}
        }).success(function(data, status, headers, cfg) {
          c.$setValidity('unique', data.isUnique);
        }).error(function(data, status, headers, cfg) {
          c.$setValidity('unique', false);
        });
      });
    }
  }
}]);
复制代码

当表单输入是有效的时,它将发送POST api/check/username请求到服务器来检查用户名是否可用。如今,很明显,由于咱们在这里只谈论前端代码,咱们没有为后端编写测试,尽管很容易。

更新: 根据评论的意见,我已经加入了服务器超时检查。要查看完整的源代码,请点击here

最后,咱们加上提交按钮,咱们可使用ng-disabled指令来根据验证是否有效控制按钮的禁用和启用:

<button type="submit" ng-disabled="signup_form.$invalid" class="button radius">Submit</button>

正如咱们上面所说的,表单是否有效的属性$invalid给咱们提供了便利。

更新 2: 虽然当即验证是很棒的,它能够当即提醒用户,可是当他们正在输入很长的能经过验证的文字时,他们讲在输入中途看到错误提示。你能够更好的来处理这一点。当用户点击提交时,或者当他们将光标移开输入框以后。让咱们来看看这2种方式。

点击提交后显示验证信息

要在用户试图提交表单时显示的验证,你能够经过在scope中设置一个'submitted'值,并检查该值来控制显示错误。

例如,让咱们来看看第一个例子,只有在点击提交表单时才显示错误。使用ng-show指令来控制显示,咱们能够添加一个检查,看是否已点击提交按钮:

复制代码
<form name="signup_form" novalidate ng-submit="signupForm()">
  <fieldset>
    <legend>Signup</legend>
    <div class="row">
      <div class="large-12 columns">
        <label>Your name</label>
        <input type="text" 
            placeholder="Name" 
            name="name" 
            ng-model="signup.name" 
            ng-minlength=3 
            ng-maxlength=20 required />
       <div class="error" 
            ng-show="signup_form.name.$dirty && signup_form.name.$invalid && signup_form.submitted">
        <small class="error" 
            ng-show="signup_form.name.$error.required">
            Your name is required.
        </small>
        <small class="error" 
                ng-show="signup_form.name.$error.minlength">
                Your name is required to be at least 3 characters
        </small>
        <small class="error" 
                ng-show="signup_form.name.$error.maxlength">
                Your name cannot be longer than 20 characters
        </small>
      </div>
      </div>
    </div>
    <button type="submit" class="button radius">Submit</button>
  </fieldset>
</form>
复制代码

 如今,那个错误信息的div只将在signup_form.submittedtrue显示。咱们能够这样实现这个signupForm方法:

复制代码
app.controller('signupController', ['$scope', function($scope) {
  $scope.submitted = false;
  $scope.signupForm = function() {
    if ($scope.signup_form.$valid) {
      // Submit as normal
    } else {
      $scope.signup_form.submitted = true;
    }
  }
}]);
复制代码

如今,当用户尝试提交表单而且同时有一个无效的元素时,你能够捕获它,并告诉他们错误的缘由。

当时去焦点时验证错误

若是你想保留错误验证的实时性,那么能够在用户离开该输入框时显示错误信息。要作到这一点,咱们能够添加一个指令,将添加一个新的变量。

咱们使用ngFocus指令,它看起来像:

复制代码
app.directive('ngFocus', [function() {
  var FOCUS_CLASS = "ng-focused";
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
      ctrl.$focused = false;
      element.bind('focus', function(evt) {
        element.addClass(FOCUS_CLASS);
        scope.$apply(function() {ctrl.$focused = true;});
      }).bind('blur', function(evt) {
        element.removeClass(FOCUS_CLASS);
        scope.$apply(function() {ctrl.$focused = false;});
      });
    }
  }
}]);
复制代码

要使用ngFocus,咱们只须要简单加上这个指令到输入框元素上,像这样:

<input ng-class="{error: signup_form.name.$dirty && signup_form.name.$invalid}" type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required ng-focus />

加上ngFocus指令后,将在输入框的blur和focus事件中注册相应操做,当焦点在该输入框时,它添加一个class(ng-focused),而且该输入框的$focused属性也将变为true。所以,你能够根据需求是否在焦点上来个性化设置显示错误消息。例如:

<div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid && !signup_form.name.$focused">

我但愿这篇文章能够告诉你如何的很酷的使用AngularJS来进行表单验证。

 

(译) AngularJS中使用的表单验证

 

客户端表单验证是AngularJS里面最酷的功能之一。 AngularJS表单验证可让你从一开始就写出一个具备交互性和可相应的现代HTML5表单。

在AngularJS中,有许多表单验证指令。在这里,咱们将谈谈几个最流行指令,而后咱们将讨论如何编写自定义的验证。

<form name="form">
  <label name="email">Your email</label>
  <input type="email" name="email" ng-model="email" placeholder="Email Address" />
</form>

AngularJS使得咱们能够在不用额外努力的状况下轻松的处理客户端表单验证。虽然咱们不能仅靠客户端验证来保持咱们的Web应用程序的安全性,但他们提供了良好即时反馈到表单上。

要使用表单验证,咱们首先必须确保form标签有一个name属性,像上面的例子同样。明白了吗?太好了!

全部输入字段能够进行一些基本的验证,例如最小长度,最大长度,等等,这些都是HTML5标签的属性验证。

一般须要在form标签中加上novalidate属性,这将禁用浏览器自带的验证功能,从而使用AngularJS提供的验证。

让咱们来看看咱们能够在input设置哪些验证:

必填

验证是否已输入字符,只需在标签上加上required

<input type="text" required />

最小长度

验证输入至少输入{number}个字符,使用AngularJS指令的ng-minlength=“{number}”

<input type="text" ng-minlength=5 />

最大长度

验证输入字符要小于等于{number}个字符,使用AngularJS指令的ng-maxlength=“{number}”

<input type="text" ng-maxlength=20 />

正则匹配

要确保输入匹配一个正则表达式,使用AngularJS的指令ng-pattern="/PATTERN/":

<input type="text" ng-pattern="/a-zA-Z/" />

Email

验证输入字符是一个电子邮件地址,只需设定inputtype属性为email,像这样:

<input type="email" name="email" ng-model="user.email" />

数字

验证输入字符是一个数字,一样只需设定inputtype属性为number,像这样:

<input type="number" name="email" ng-model="user.age" />

Url

验证输入字符是一个URL地址,一样只需设定inputtype属性为url,像这样:

<input type="url" name="homepage" ng-model="user.facebook_url" />

自定义验证

AngularJS能够很容易的使用指令来添加自定义验证。例如,咱们要验证咱们的用户名是可用的(在数据库中不重复)。要作到这一点,咱们将实现一个指令,它在输入字符变化时触发一个Ajax请求:

复制代码
var app = angular.module('validationExample', []);

app.directive('ensureUnique', ['$http', function($http) {
  return {
    require: 'ngModel',
    link: function(scope, ele, attrs, c) {
      scope.$watch(attrs.ngModel, function() {
        $http({
          method: 'POST',
          url: '/api/check/' + attrs.ensureUnique,
          data: {'field': attrs.ensureUnique}
        }).success(function(data, status, headers, cfg) {
          c.$setValidity('unique', data.isUnique);
        }).error(function(data, status, headers, cfg) {
          c.$setValidity('unique', false);
        });
      });
    }
  }
}]);
复制代码

验证表单状态

AngularJS将DOM验证的结果保存在$scope对象中。这使咱们可以实时作出一些响应。提供给咱们的属性有:

请注意,这是这个属性的格式:

formName.inputFieldName.property

未修改过的表单

布尔值属性,表示用户是否修改了表单。若是为ture,表示没有修改过;false表示修改过:

formName.inputFieldName.$pristine;

修改的表单

布尔型属性,当且仅当用户实际已经修改的表单。无论表单是否经过验证:

formName.inputFieldName.$dirty

通过验证的表单

布尔型属性,它指示表单是否经过验证。若是表单当前经过验证,他将为true

formName.inputFieldName.$valid

未经过验证的表单

布尔型属性,它指示表单是否经过验证。若是表单当前没有经过验证,他将为true

formName.inputFieldName.$invalid

最后两个属性在用于DOM元素的显示或隐藏时是特别有用的。同时,若是要设置特定的class时,他们也很是有用的。

错误

另外一个有用的属性是AngularJS提供给咱们的$error对象。这个对象包含input的每个验证是有效的仍是无效的(一个集合)。为了访问这个属性,使用下面的语法:

formName.inputfieldName.$error

若是验证失败,则此属性将是true的,而若是它是false的,那么该值经过验证的。

无害的一些样式

当AngularJS处理的表单验证时,它将根据验证的状态增长一些特定的class属性。这些class被命名为相似的属性,咱们能够检查。

这些class是:

.ng-pristine {}
.ng-dirty {}
.ng-valid {}
.ng-invalid {}

这些class对应着其对应的验证对象的结果。

当一个字段是无效的,  .ng-invalid将被应用到这个字段上。咱们能够经过css来设置这些class的样式:

复制代码
input.ng-invalid {
  border: 1px solid red;
}
input.ng-valid {
  border: 1px solid green;
}
复制代码

 

所有放在一块儿

让咱们编写一个注册表单。本申请表单将包括这我的的名字,他们的电子邮件,以及所需的用户名。

 

让咱们定义一个form表单:

复制代码
<form name="signup_form" novalidate ng-submit="signupForm()">
  <fieldset>
    <legend>Signup</legend>

    <button type="submit" class="button radius">Submit</button>
  </fieldset>
</form>
复制代码

这个表单的名字是signup_form ,当咱们点击提交时咱们将调用signupForm()方法.

如今,让咱们添加用户的Name属性:

复制代码
<div class="row">
  <div class="large-12 columns">
    <label>Your name</label>
    <input type="text" 
        placeholder="Name" 
        name="name" 
        ng-model="signup.name" 
        ng-minlength=3 
        ng-maxlength=20 required />
  </div>
</div>
复制代码

 首先我想说明我使用了 Foundation 做为个人css框架,因此你将在代码中看到它的相关语法。 咱们增长了一个名字为name的输入框,而且对象绑定在$scope对象的signup.name对象上(经过ng-model)。

咱们还设置了几个验证。这些验证分别是:咱们必须有一个长度为3个或更多字符的名字。而且最大长度限制为20个字符(21或更多的个字符将是无效的)。最后,咱们设置名称应该是必填的。

当若是表单无效时,让咱们用属性来控制显示仍是隐藏错误列表。咱们还将使用$dirty属性,以确保当用户没有输入字符前错误提示不显示:

复制代码
<div class="row">
  <div class="large-12 columns">
    <label>Your name</label>
    <input type="text" 
        placeholder="Name" 
        name="name" 
        ng-model="signup.name" 
        ng-minlength=3 
        ng-maxlength=20 required />
   <div class="error" 
        ng-show="signup_form.name.$dirty && signup_form.name.$invalid">
    <small class="error" 
        ng-show="signup_form.name.$error.required">
        Your name is required.
    </small>
    <small class="error" 
            ng-show="signup_form.name.$error.minlength">
            Your name is required to be at least 3 characters
    </small>
    <small class="error" 
            ng-show="signup_form.name.$error.maxlength">
            Your name cannot be longer than 20 characters
    </small>
  </div>
  </div>
</div>
复制代码

让咱们来看看接下来的验证,一个电子邮件:

复制代码
<div class="row">          
  <div class="large-12 columns">
    <label>Your email</label>
    <input type="email" 
      placeholder="Email" 
      name="email" 
      ng-model="signup.email" 
      ng-minlength=3 ng-maxlength=20 required />
    <div class="error" 
         ng-show="signup_form.email.$dirty && signup_form.email.$invalid">
      <small class="error" 
             ng-show="signup_form.email.$error.required">
             Your email is required.
      </small>
      <small class="error" 
             ng-show="signup_form.email.$error.minlength">
              Your email is required to be at least 3 characters
      </small>
      <small class="error" 
             ng-show="signup_form.email.$error.email">
             That is not a valid email. Please input a valid email.
      </small>
      <small class="error" 
             ng-show="signup_form.email.$error.maxlength">
              Your email cannot be longer than 20 characters
      </small>
    </div>
  </div>
</div>
复制代码

这一次(包括整个表单),咱们编写电子邮件字段。请注意,咱们设置了input的type属性为email而且添加了$error.email错误信息。这是基于AngularJS的电子邮件验证(使用HTML5的属性)。

最后,让咱们来看看在咱们的最后一个输入框,用户名:

复制代码
<div class="large-12 columns">
  <label>Username</label>
    <input  type="text" 
            placeholder="Desired username" 
            name="username" 
            ng-model="signup.username" 
            ng-minlength=3 
            ng-maxlength=20 
            ensure-unique="username" required />
  <div class="error" ng-show="signup_form.username.$dirty && signup_form.username.$invalid">
    <small class="error" ng-show="signup_form.username.$error.required">Please input a username</small>
    <small class="error" ng-show="signup_form.username.$error.minlength">Your username is required to be at least 3 characters</small>
    <small class="error" ng-show="signup_form.username.$error.maxlength">Your username cannot be longer than 20 characters</small>
    <small class="error" ng-show="signup_form.username.$error.unique">That username is taken, please try another</small>
  </div>
</div>
复制代码

在咱们的最后一个字段,咱们使用咱们以前编写的自定义验证。这个自定义验证使用的AngularJS指令:

复制代码
app.directive('ensureUnique', ['$http', function($http) {
  return {
    require: 'ngModel',
    link: function(scope, ele, attrs, c) {
      scope.$watch(attrs.ngModel, function() {
        $http({
          method: 'POST',
          url: '/api/check/' + attrs.ensureUnique,
          data: {'field': attrs.ensureUnique}
        }).success(function(data, status, headers, cfg) {
          c.$setValidity('unique', data.isUnique);
        }).error(function(data, status, headers, cfg) {
          c.$setValidity('unique', false);
        });
      });
    }
  }
}]);
复制代码

当表单输入是有效的时,它将发送POST api/check/username请求到服务器来检查用户名是否可用。如今,很明显,由于咱们在这里只谈论前端代码,咱们没有为后端编写测试,尽管很容易。

更新: 根据评论的意见,我已经加入了服务器超时检查。要查看完整的源代码,请点击here

最后,咱们加上提交按钮,咱们可使用ng-disabled指令来根据验证是否有效控制按钮的禁用和启用:

<button type="submit" ng-disabled="signup_form.$invalid" class="button radius">Submit</button>

正如咱们上面所说的,表单是否有效的属性$invalid给咱们提供了便利。

更新 2: 虽然当即验证是很棒的,它能够当即提醒用户,可是当他们正在输入很长的能经过验证的文字时,他们讲在输入中途看到错误提示。你能够更好的来处理这一点。当用户点击提交时,或者当他们将光标移开输入框以后。让咱们来看看这2种方式。

点击提交后显示验证信息

要在用户试图提交表单时显示的验证,你能够经过在scope中设置一个'submitted'值,并检查该值来控制显示错误。

例如,让咱们来看看第一个例子,只有在点击提交表单时才显示错误。使用ng-show指令来控制显示,咱们能够添加一个检查,看是否已点击提交按钮:

复制代码
<form name="signup_form" novalidate ng-submit="signupForm()">
  <fieldset>
    <legend>Signup</legend>
    <div class="row">
      <div class="large-12 columns">
        <label>Your name</label>
        <input type="text" 
            placeholder="Name" 
            name="name" 
            ng-model="signup.name" 
            ng-minlength=3 
            ng-maxlength=20 required />
       <div class="error" 
            ng-show="signup_form.name.$dirty && signup_form.name.$invalid && signup_form.submitted">
        <small class="error" 
            ng-show="signup_form.name.$error.required">
            Your name is required.
        </small>
        <small class="error" 
                ng-show="signup_form.name.$error.minlength">
                Your name is required to be at least 3 characters
        </small>
        <small class="error" 
                ng-show="signup_form.name.$error.maxlength">
                Your name cannot be longer than 20 characters
        </small>
      </div>
      </div>
    </div>
    <button type="submit" class="button radius">Submit</button>
  </fieldset>
</form>
复制代码

 如今,那个错误信息的div只将在signup_form.submittedtrue显示。咱们能够这样实现这个signupForm方法:

复制代码
app.controller('signupController', ['$scope', function($scope) {
  $scope.submitted = false;
  $scope.signupForm = function() {
    if ($scope.signup_form.$valid) {
      // Submit as normal
    } else {
      $scope.signup_form.submitted = true;
    }
  }
}]);
复制代码

如今,当用户尝试提交表单而且同时有一个无效的元素时,你能够捕获它,并告诉他们错误的缘由。

当时去焦点时验证错误

若是你想保留错误验证的实时性,那么能够在用户离开该输入框时显示错误信息。要作到这一点,咱们能够添加一个指令,将添加一个新的变量。

咱们使用ngFocus指令,它看起来像:

复制代码
app.directive('ngFocus', [function() {
  var FOCUS_CLASS = "ng-focused";
  return {
    restrict: 'A',
    require: 'ngModel',
    link: function(scope, element, attrs, ctrl) {
      ctrl.$focused = false;
      element.bind('focus', function(evt) {
        element.addClass(FOCUS_CLASS);
        scope.$apply(function() {ctrl.$focused = true;});
      }).bind('blur', function(evt) {
        element.removeClass(FOCUS_CLASS);
        scope.$apply(function() {ctrl.$focused = false;});
      });
    }
  }
}]);
复制代码

要使用ngFocus,咱们只须要简单加上这个指令到输入框元素上,像这样:

<input ng-class="{error: signup_form.name.$dirty && signup_form.name.$invalid}" type="text" placeholder="Name" name="name" ng-model="signup.name" ng-minlength=3 ng-maxlength=20 required ng-focus />

加上ngFocus指令后,将在输入框的blur和focus事件中注册相应操做,当焦点在该输入框时,它添加一个class(ng-focused),而且该输入框的$focused属性也将变为true。所以,你能够根据需求是否在焦点上来个性化设置显示错误消息。例如:

<div class="error" ng-show="signup_form.name.$dirty && signup_form.name.$invalid && !signup_form.name.$focused">

我但愿这篇文章能够告诉你如何的很酷的使用AngularJS来进行表单验证。

相关文章
相关标签/搜索