这一节相对来说需要理解的东西不是太多,记住了那些api就行了。

还是一个案例(同样来自miaov),一个表单验证,先上代码,然后再对对应的内容进行解释。

<!DOCTYPE html>
<html lang="en" ng-app="myApp">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<div ng-controller="Aaa">
<form novalidate name="nForm">
<div>
<label>用户名</label>
<input type="text" name="nText" ng-model="regText.name" required ng-pattern="/^[a-zA-Z]+$/" ng-blur="change('regText',nForm.nText.$error)">
<span ng-repeat="re in regText.regList|filter:regText.regVal">{{re.tips}}</span>
</div>
<div>
<label>密码</label>
<input type="text" name="nPassword" ng-model="regPassword.name" required ng-minlength="6" ng-blur="change('regPassword',nForm.nPassword.$error)">
<span ng-repeat="re in regPassword.regList|filter:regPassword.regVal">{{re.tips}}</span>
</div>
</form>
</div>
<body>
<script src="angular.min.js"></script>
<script>
var m1=angular.module("myApp",[]);
m1.controller("Aaa",["$scope", function ($scope) {
$scope.regText = {
regVal : 'default',
regList : [
{ name : 'default' , tips : '请输入用户名'},
{ name : 'required' , tips : '用户名不能为空'},
{ name : 'pattern' , tips : '用户名必须是字母'},
{ name : 'pass' , tips : '√'}
]
};
$scope.regPassword = {
regVal : 'default',
regList : [
{ name : 'default' , tips : '请输入密码'},
{ name : 'required' , tips : '密码不能为空'},
{ name : 'minlength' , tips : '密码至少6位'},
{ name : 'pass' , tips : '√'}
]
}; $scope.change=function(reg,err){
for(var attr in err){
if(err[attr]==true){
$scope[reg].regVal=attr;
return;
}
}
$scope[reg].regVal="pass";
} }]);
</script>
</body>
</html>

1.模块module

模块这东西的好处我还没有体会出来,可能是因为做的东西代码量还太小。它的功能基本上是讲代码按照功能分成若干块,这样就可以有效地防止controller的混乱(在我看来就是再来一级分类管理)。

具体代码就是

html中

<html lang="en" ng-app="myApp">

其中"myApp"就是这个模块的名字

对应的js代码

var m1=angular.module("myApp",[]);

其中,第二个参数是这个模块需要依赖的模块。

当然,controller的写法也要变一变了,至少你得告诉程序你这个controller是写在哪个模块里的吧。

m1.controller("Aaa",["$scope",function($scope){
//code
}]);

其中$scope是注入的服务

2.表单相关

表单验证相关操作其实大部分是在标签内写的

<input type="text" name="nText" ng-model="regText.name" required ng-pattern="/^[a-zA-Z]+$/" ng-blur="change('regText',nForm.nText.$error)">

这几个api是啥意思就不仔细说了,反正意思就是一些字符串验证的规则,想要通过就必须符合这些规则。当然,如果你只想告诉用户通不通过而不想写那么多原因的话大可以一个正则搞定。重点是:通不过会发生什么? 很简单,通不过的话ng-model对应的变量值就是 undefined。另外一个值得注意的问题是何时触发验证,改变验证提示(提示内容还是需要写逻辑的)。有一类是像百度搜索提示那样,输入内容改变一下就触发一次,但是实际上对于表单验证来说这样做并不合适,因为1.其实你只需要在用户觉得输入完了验证,这样做会增加不少不必要的代码运行2.如果你设置了类似于字段长度之类的限制,在输入到一半的时候可能跳出来”长度不够”之类的。要是我遇到这种表单验证,心里肯定会默默骂一句:我tm还没敲完呢。所以在input标签失去焦点的时候进行验证还是不错的,因为这时基本上可以代表用户觉得我输入完了。实际不早也不晚。

3.ng-repeat和filter

<span ng-repeat="re in regPassword.regList|filter:regPassword.regVal">{{re.tips}}</span>

ng-repeat在我看来就是根据数据长度来自定义html结构的 常用在<li>  <table>之类的数据展示情景中。写起来有点像for in循环

比如上面的例子,在不考虑filter的情况下,span标签的数量就是regPassword.regList中的元素个数,这个用来遍历的对象可以是数组或者对象。

filter的作用就是在它们当中筛选出需要的字符串,当然还有其他的过滤器,自己看看就明白了,都是api。filter的意思是筛选出符合regPassword.regVal的re。嗯,当然后面写个true的话就变成了不是包含而是必须完全匹配。

这一部分相对简单,所以能省则省。下一步写关于angular非常重要的一部分,路由(ng-route)。

AngularJS学习笔记(二) 表单验证案例(ng-repeat/filter)的更多相关文章

  1. Bootstrap学习笔记(二) 表单

    在Bootstrap学习笔记(一) 排版的基础上继续学习Bootstrap的表单,编辑器及head内代码不变. 3-1 基础表单 单中常见的元素主要包括:文本输入框.下拉选择框.单选按钮.复选按钮.文 ...

  2. Django学习笔记之表单验证

    表单概述 HTML中的表单 单纯从前端的html来说,表单是用来提交数据给服务器的,不管后台的服务器用的是Django还是PHP语言还是其他语言.只要把input标签放在form标签中,然后再添加一个 ...

  3. JavaScript入门学习笔记(表单验证)

    表单验证: 在数据被送到服务器之前对HTML表单中的输入数据进行验证,避免服务器频繁验证信息造成用户体验差. (1)表单数据是否为空 (2)输入的信息格式是否正确 (3)输入数据的类型是否正确 必填( ...

  4. JavaScript 表单验证 案例

    JavaScript 表单验证 案例 版权声明:未经授权,严禁转载!   编写 HTML 文件,搭建主体界面 <html> <head> <meta charset=&q ...

  5. 使用jquery插件validate制作的表单验证案例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. AngularJS 1.2.x 学习笔记(表单校验篇)

    https://my.oschina.net/cokolin/blog/526911 摘要: 本文首发于 blog.csdn.net/vipshop_ebs/article/details/39472 ...

  7. jQuery学习笔记2——表单操作

    一.获取和设置表单的值:val()和text() 1. 获取表单的值: $("#username").val(); 2. 设置表单的值: $("#username&quo ...

  8. jQuery表单验证案例

    目标:使用jQuery进行表单验证. 功能:1.必填选项后面添加了红色小星星: 2.选中开始输入时,输入文本框会改变当前背景色,增强用户体验: 3.输入的时候就开始验证,当输入格式正确就会提醒,就是当 ...

  9. AngularJs 入门系列-2 表单验证

    对于日常的开发来说,最常见的开发场景就是通过表单编辑数据,这里涉及的问题就是验证问题. angularjs 内置已经支持了常见的验证方式,可以轻松实现表单验证. 1. 绑定 为了方便,我们在 $sco ...

随机推荐

  1. 【cogs182】【USACO Jan07】均衡队形【st表】

    题目描写叙述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按相同的顺序站好. 一日.农夫约翰决定为奶牛们举行一个"终极飞盘"比赛.为简化问题.他将从奶牛 ...

  2. 4Sum_leetCode

    Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...

  3. struts2中配置文件加载的顺序是什么?

    struts2的StrutsPrepareAndExecuteFilter拦截器中对Dispatcher进行了初始化 在Dispatcher类的init方法中定义了配置文件的加载顺序(下面是源码) p ...

  4. Binding基础 文摘

    简要 Binding基础 Binding源与路径 列举Binding的源 Binding基础 从Coding中看Binding的基础. 先定义一个Student类: public class Stud ...

  5. java.lang.IllegalStateException: ImageView no longer exists. You should not use this PhotoViewAttacher any more.

    java.lang.IllegalStateException: ImageView no longer exists. You should not use this PhotoViewAttach ...

  6. Lifting the Stone(多边形重心)

    Lifting the Stone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  7. EasyNVR结合阿里云/腾讯云CDN实现微信/小程序直播的方案

    背景需求: 许多客户有这样的需求:微信公众号做为平台来对摄像机进行直播:可以让用户随时随地打开公共号就可以观看:保证画面的流畅性:保证视频的并发访问量等. 问题分析: 虽然需求看似很简单,其实真正实现 ...

  8. Effective Java 读书笔记(一):使用静态工厂方法代替构造器

    这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文&l ...

  9. 什么是GIL锁以及作用

    全局解释锁,每次只能一个线程获得cpu的使用权:为了线程安全,也就是为了解决多线程之间的数据完整性和状态同步而加的锁,因为我们知道线程之间的数据是共享的.

  10. 了解CentOS服务器的基本信息

    简单描述了如何从CPU.内存.硬盘性能.负载方面去了解自己工作的服务器性能.这个很重要,必须了解机器的方方面面才能提高在自己运维工作效率. 一.查看linux服务器cpu详情 查看物理cpu个数: [ ...