ngMessages(1.3+)

表单和验证是AngularJS中复杂的组件之一。用AngularJS默认的方式来写,不是特别好,不简洁。

在AngualrJS1.3发布前,表单验证必须以这种方式编写。

如今随着AngularJS1.3的发布,AngularJS核心做了一个升级。它不再需要基于一个详细的表达式状态创建元素显示或者隐藏。

HTML

<form name="signup_form" novalidate ng-submit="signupForm()"
ng-controller="signupController">
<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">Submit</button>
</fieldset>
</form>

本质上这一功能会检查错误对象的状态发生了变化,此外,我们不得到了站点中每个表单需要的

很多额外的重复的标记。这显然不是一个理想的解决方案。

从1.3开始,Angualr中新增一个ngMessage指令。

$ bower install --save angular-messages

还需要将angular-messages.js这个JavaScript引入我们的主HTML中:

<script type="text/javascript" src="bower_components/angular-messages/angular-messages.js"> </script>

我们还要告诉Angular将ngMessages作为应用程序的依赖模块引入,就像这样:

angular.module('myApp', ['ngMessages']);

现在,我们已经安装了ngMessage,然后可以马上开始使用它了。使用前面的例子作为基础,你可以移除ng-show,然后

使用ngMessage的一个更简洁的实现替换它。

<form name="signup_form" novalidate ng-submit="signupForm()"
ng-controller="signupController">
<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-messages="signup_form.name.$error">
<div ng-message="required">Make sure you enter your name</div>
<div ng-message="minlength">Your name must be at least 3 characters</div>
<div ng-message="maxlength">Your name cannot be longer than 20 characters</div>
</div>
<button type="submit">Submit</button>
</form>
  • 借助ngMessages, 表本身比前面的实现更清洁,并且更好理解。

然而对于这个实现,一次只会显示一个错误信息。如果我们想要更新这个实现同时显示所有的错误将会怎样?

也是很容易实现的。只需要在ng-message指令旁边使用ng-message-multiple属性即可。

<div class="error" ng-messages="signup_form.name.$error" ng-messages-multiple>
<div ng-message="required"> sure you enter your name</div>
<div ng-message="minlength">Your name must be at least 3 characters</div>
<div ng-message="maxlength">Your name cannot be longer than 20 characters</div>
</div>

很多时候这些信息之间非常相似。我们可以将它们保存到模块中从而减少麻烦。而不是重新输入每个字段的错误信息。

<!-- In templates/errors.html -->
<div ng-message="required">This field is required</div>
<div ng-message="minlength">The field must be at least 3 characters</div>
<div ng-message="maxlength">The field cannot be longer than 20 characters</div>

然后我们可以通过在视图中使用ng-messages-include属性引入这个模版来改进这个表单:

<div class+'error' ng-messages="signup_form.name.$error"
ng-messages-include="templates/errors.html">
</div>

有时,你可能希望为不同的字段自定义错误信息。没问题,你可以在这个指令内简单地插入一个自定义错误信息。

由于ngMessages涉及ngMessages容器中错误列表的顺序,我们可以通过在这个指令中列出自定义错误信息的方式覆盖它们。

<div class="error" ng-messages="signup_form.name.$error"
ng-messages-include="templates/errors.html">
<!-- 除了minlength会被覆盖之外,其他每个信息都会保持不变-->
</div>

此外,甚至还可以为自定义验证创建自定义消息。可以通过修改模型的$parsers链做到这一点。

例如,比方说我们想要创建一个自定义验证器验证用户名在一个注册表单中是否有效:

对于ngModel,你可以添加可以使用ngMessage指令显示/隐藏的自定义信息。还可以添加可以使用ngMessage

指令检查的带有自定义的消息的指令。例如,改变前面使用ngMessages的例子。

HTML

<form name="signup_form" novalidate ng-submit="signupForm()" ng-controller="signupController"
ensure-unique="/api/checkUsername.json">
<label>
Your name
</label>
<input type="text" placeholder="Username" name="username" ng-model="signup.username"
ng-minlength=3 ng-maxlength=20 required />
<div class="error" ng-messages="signup_form.username.$error">
<div ng-message="required">
Make sure you enter your username
</div>
<div ng-message="checkingAvailability">
Checking...
</div>
<div ng-message="usernameAvailablity">
The username has already been taken. Please choose another
</div>
</div>
<button type="submit">
Submit
</button>
</form>

在这个用法中,我们检查了错误信息的自定义属性。为了添加自定义错误信息,我们将会把它们应用到自定义ensureUnique指令的ngModel中。

JAVASCRIPT

app.directive('ensureUnique', function($http) {
return {
require: 'ngModel',
link: function(scope, ele, attrs, ctrl) {
var url = attrs.ensureUnique;
ctrl.$parsers.push(function(val) {
if (!val || val.length === 0) {
return;
}
ngModel.$setValidity('checkingAvailability', true);
ngModel.$setValidity('usernameAvailablity', false);
$http({
method: 'GET',
url: url,
params: {
username: val
}
}).success(function() {
ngModel
.$setValidity('checkingAvailability', false);
ngModel
.$setValidity('usernameAvailablity', true);
})['catch'](function() {
ngModel
.$setValidity('checkingAvailability', false);
ngModel
.$setValidity('usernameAvailablity', false);
});
return val;
})
}
}
});

AngularJs -- ngMessages(1.3+)的更多相关文章

  1. angularjs 1.3 综合学习 (one way bind , ng-if , ng-switch , ng-messages, ng-form ,ng-model )

    主要讲解1.3后的一些新功能,和一些以前没有介绍的小功能 (ng-if,ng-switch). 1.one way bind 这个之前的版本已经有人自己实现了,但是在1.3之后,angularjs 有 ...

  2. angularjs使用ng-messages的注册表单实例

    <!DOCTYPE html> <html lang="zh-CN" ng-app="app"> <head> <me ...

  3. [AngularJS] Angular 1.3 ngMessages with ngAnimate

    Note: Can use $dirty to check whether user has intracted with the form: https://docs.angularjs.org/a ...

  4. AngularJS使用ngMessages进行表单验证

    名称为"ngMessages"的module,通过npm install angular-messages进行安装.在没有使用ngMessages之前,我们可能这样写验证: < ...

  5. ng-messages AngularJs 表单校验方式

    最新研究了一下表单校验,直接上代码. <!DOCTYPE html><html ng-app='app'><head> <meta charset=" ...

  6. [AngularJS] AngularJS系列(3) 中级篇之表单验证

    目录 基本验证 验证插件messages 自定义验证 基本验证 <form name="form" novalidate ng-app> <span>{{f ...

  7. AngularJS中的表单验证

    AngularJS中的表单验证 AngularJS自带了很多验证,什么必填,最大长度,最小长度...,这里记录几个有用的正则式验证 1.使用angularjs的表单验证 正则式验证 只需要配置一个正则 ...

  8. AngularJS学习笔记

    一.初识AngularJS:1.Angularjs通过创建实时模板来代替视图,而不是将数据合并进模板后更新DOM,任何一个独立视图组件中的值都是动态替换的. 二.数据绑定和第一个AngularJS W ...

  9. AngularJS in Action读书笔记4(实战篇)——创建Statistic模块

    个人感觉<Angularjs in action>这本书写的很好,很流畅,循序渐进,深入浅出,关键是结合了一个托管于Github上的实例讲解的,有代码可查,对于初学者应该是个不错的途径.( ...

随机推荐

  1. mac 安装 tomcat 配置

    前面的话:记录下 Mac 安装配置 Tomcat 过程 1. 下载安装 Tomcat 下载 Tomcat 地址(官方地址):https://tomcat.apache.org/download-80. ...

  2. M1事后分析报告

    在得到M1团队成绩之后,每个团队都需要编写一个事后分析报告,对于团队在M1阶段的工作做一个总结. 请在2015年11月24日上课之前根据下述博客中的模板总结前一阶段的工作,发表在团队博客上,并在课上的 ...

  3. 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析

    一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...

  4. C++:派生类的构造函数和析构函数的调用顺序

    一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: • 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. • 改造基类函数:在 ...

  5. OFART: OpenFlow-Switch Adaptive Random Testing

    文章名称:OFART: OpenFlow-Switch Adaptive Random Testing 发表时间:2017 期刊来源:--- 摘要 问题: 如果转发设备的正确性没有验证,这将影响这个网 ...

  6. 第一个spring,第一天。

    陈志棚:界面跳转与框架 李天麟:游戏界面ui 徐侃:算法代码的设计 经过热烈的讨论后,我们各自在完成自己的任务.

  7. ElasticSearch 2 (14) - 深入搜索系列之全文搜索

    ElasticSearch 2 (14) - 深入搜索系列之全文搜索 摘要 在看过结构化搜索之后,我们看看怎样在全文字段中查找相关度最高的文档. 全文搜索两个最重要的方面是: 相关(relevance ...

  8. php redis 的基本操作

    前言: 断断续续的接触了redis的使用.但是也就简单的记住了几个set.get方法,用的还是太少了吧.所以来做个笔记,记录下一些常用的命令. 内容: 首先是php连接redis. $redis = ...

  9. bootstrap响应式布局列子

    <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...

  10. 一本通1656Combination

    1656:Combination 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 原题来自:BZOJ 2982 LMZ 有 n 个不同的基友,他每天晚上要选  ...