Skip to content

Commit 98d0387

Browse files
committed
Add article for advanced form usage.
1 parent 32d10aa commit 98d0387

File tree

3 files changed

+115
-3
lines changed

3 files changed

+115
-3
lines changed

README

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
1. [修饰器](https://github.com/tiw/angularjs-tutorial/blob/master/decorator.markdown)
77
1. [在controller间共享数据](https://github.com/tiw/angularjs-tutorial/blob/master/sharing-data-between-controllers.markdown)
88
1. [angularjs事件broadcast 和 emit](https://github.com/tiw/angularjs-tutorial/blob/master/event.markdown)
9-
1. [angularjs 表单](https://github.com/tiw/angularjs-tutorial/blob/master/ng-form.markdown)
9+
1. [angularjs 表单入门](https://github.com/tiw/angularjs-tutorial/blob/master/ng-form.markdown)
10+
1. [angularjs 表单进阶](https://github.com/tiw/angularjs-tutorial/blob/master/ng-form2.markdown)

ng-form.markdown

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ input 绑定到了一起
4040
这里分两部分, 第一部分是angular自带的验证器, 另一部分是自己实现的验证器。
4141
这里只介绍第一种情况。 第二个会在单独的文章里描述。
4242

43-
angularjs 自带了一些html5的验证, 比如: 必填项、email、url (到1.0.7)其实只有这
44-
三个 !!!^ ^
43+
angularjs 自带了一些html5的验证, 比如: 必填项、email、url.
44+
45+
Angular实现了html5常用的input类型, 包括 (text, number, url, email, radio, checkbox)
46+
同时实现了下面的directive做验证(required, pattern, minlength, maxlength, min, max).
4547

4648
用法一如既往的简单, 都是声明式的. 下面我们定义了一个input,名字叫做 personEmail,
4749
要求必须有输入,而且输入的必须是一个email. 通过变量

ng-form2.markdown

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# form 进阶
2+
3+
## css 样式
4+
5+
对于表单在不同状态下, 我们可能希望它有不同的样式。举个具体的例子,我们希望表单
6+
中名字这项是必填的, 如果没填就显示黄色背景, 提示用户。 这里有个问题, 就是当
7+
表单首次显示的时候, 及时这个时候名字这项是空的, 我们也不希望显示黄色背景。
8+
9+
ng form 会给根据具体情况给表单里的每项自动添加下列 css class:
10+
11+
1. ng-valid: 验证通过
12+
1. ng-invalid: 验证没有通过
13+
1. ng-pristine: 用户没有输入任何东西
14+
1. ng-dirty: 用户输入了东西, 不管最终值有木有改变。 例如开始里面是空的,
15+
填写了ab, 之后又吧ab删除了, 这是也是dirty的.
16+
17+
18+
通过这个类我们可以实现我们上面想要的效果
19+
20+
```html
21+
<form name="myForm" ng-submit="save()">
22+
<input type="text" name="personName" ng-model="person.name" required>
23+
<input type="submit" value="保存"/>
24+
</form>
25+
<style type="text/css">
26+
input.ng-invalid.ng-dirty {
27+
background-color: yellow;
28+
}
29+
</style>
30+
```
31+
32+
[demo](http://plnkr.co/8D8BNILDPHQ4XKODBYbe)
33+
34+
## customer validation 自定义的验证
35+
36+
form入门里我们已经了解到了, angularjs实现了常用的一些表单验证。
37+
38+
* required
39+
* pattern
40+
* minlength
41+
* maxlength
42+
* min
43+
* max
44+
45+
现实中可能需要自定义的一些验证器, 比如在管理scrum story point的时候, 故事点数只
46+
能是 1, 2, 3, 5, 8, 13, 20, 40, 80。 下面我们实现并且使用我们自己定义的
47+
directive
48+
49+
```js
50+
angular.module('myApp')
51+
.directive('spoint', function() {
52+
return {
53+
require: 'ngModel',
54+
link: function(scope, elm, attrs, ctrl) {
55+
var fibonacci = [1, 2, 3, 5, 8, 13, 20, 40, 80];
56+
ctrl.$parsers.unshift(function(viewValue) {
57+
if (fibonacci.indexOf(parseInt(viewValue)) >= 0) {
58+
ctrl.$setValidity('fibonacci', true);
59+
return viewValue;
60+
} else {
61+
ctrl.$setValidity('fibonacci', false);
62+
return undefined;
63+
}
64+
});
65+
}
66+
};
67+
});
68+
69+
```
70+
71+
这里值得注意的是directive里link方法的第四个参数,我们在require里定义了ngModel
72+
所以这里它是一个 NgModelController
73+
http://docs.angularjs.org/api/ng.directive:ngModel.NgModelController。
74+
75+
NgModelController是用来为ng-model提供了一组API。通过他我们可以他来确定ngModel的
76+
值是否是合法的。 我们这里只介绍其中和表单验证有关的几个方法和属性。
77+
78+
上面的例子中我们用到了$parsers这个属性和$setValidity()这个方法。
79+
$parsers里保存了一组function, 每当DOM里数据变化的时候, 这组function会被一次掉
80+
用。这里给了我们机会在用户修改了DOM里值的时候, 去对新输入的值做校验。
81+
具体的校验就是
82+
83+
```js
84+
85+
if (fibonacci.indexOf(parseInt(viewValue)) >= 0) {
86+
ctrl.$setValidity('fibonacci', true);
87+
return viewValue;
88+
} else {
89+
ctrl.$setValidity('fibonacci', false);
90+
return undefined;
91+
}
92+
```
93+
94+
标记一个model的值是否合法是通过方法 $setValidity 实现的。 这个方法有两个参数,
95+
第一个是验证器的名字, 这里我们起名叫fibonacci。 这个名字会被使用显示对于的出错信息
96+
就像我们在入门篇里用到的
97+
98+
```js
99+
myForm.personEmail.$error.required
100+
myForm.personEmail.$error.email
101+
```
102+
103+
里面的email 或是required。
104+
105+
第二个参数是个boole, 就是用来标记是否合法的。
106+
return的值会传递给下一个 $parsers 里的function, 返回undefined的话会终止继续传递。
107+
108+
[demo](http://plnkr.co/xYblQDCJ0cL7liZG6PW3)
109+

0 commit comments

Comments
 (0)