File tree Expand file tree Collapse file tree 2 files changed +110
-0
lines changed
Expand file tree Collapse file tree 2 files changed +110
-0
lines changed Original file line number Diff line number Diff line change 1+ # Decorator
2+
3+ 装饰, 在已有的功能上锦上添花
4+
5+ ## Use case 使用场景:
6+
7+ 我有一个module A依赖于另外一个module B。 module B有个service Mail, 这个服务提供
8+ 两个方法 setReceiver 和 setBody 分别用来指定邮件的收件人和邮件的内容。 但是在
9+ module A 使用Mail服务的时候, 我希望还可以指定抄送的人。 这个时候我就可以在已有
10+ 的service上扩展下(装饰下)加个addCC的方法。
11+
12+ ## Example
13+
14+ ### Module A
15+
16+ ``` js
17+ var Mail = function () {
18+ this .receiver = ' ' ;
19+ this .body = ' ' ;
20+ this .cc = [];
21+ };
22+
23+ Mail .prototype .setReceiver = function (receiver ) {
24+ this .receiver = receiver;
25+ };
26+
27+ Mail .prototype .setBody = function (body ) {
28+ this .body = body;
29+ };
30+
31+ angular .module (' A' , []).service (' Mail' , Mail);
32+ ```
33+
34+ ### Module B
35+ ``` js
36+ angular .module (' B' , [' A' ]).config (function ($provide ) {
37+ $provide .decorator (' Mail' , function ($delegate ) {
38+ $delegate .addCC = function (cc ) {
39+ this .cc .push (cc);
40+ };
41+ return $delegate;
42+ });
43+ })
44+ .controller (' TestCtrl' , function ($scope , Mail ) {
45+ Mail .addCC (' jack' );
46+ console .log (Mail);
47+ });
48+ ```
49+ [ demo] ( http://plnkr.co/C5lWho67ORU7rhRNHO5F )
Original file line number Diff line number Diff line change 1+ # Sharing Data between Controller
2+
3+ 在controller间分享数据
4+
5+ ## Blood 血腥的方法
6+
7+ 每个controller都有自己的scope, 同时也可以共享他们老爸的scope内的数据。如果我们想让两个controller共享数据的化, 有多种方法。 最直接血腥的就是在他们老爸的scope里定义一个model。
8+
9+ ``` html
10+ <input type =" text" ng-model =" person.name" />
11+ <div ng-controller =" FirstCtrl" >
12+ {{person.name}}
13+ <button ng-click =" setName()" >set name to jack</button >
14+ </div >
15+ <div ng-controller =" SecondCtrl" >
16+ {{person.name}}
17+ <button ng-click =" setName()" >set name to jack</button >
18+ </div >
19+ </div >
20+ ```
21+
22+ 需要注意的是, 必须定义一个对象, 并且在每个controller里都是修改这个对象的属性。比如在FirstController里的setName 里修改name: person.name = 'Jack' , 如果你在setName里 person = {name: 'Jack'} 呵呵, 效果大家自己试试, 原因是js的prototype的特性。
23+
24+
25+ 这个方法血腥的原因是所有共享的数据都要在上级定义, 如果子controller多了, 共享数据是指数级上升的, 如此老爸的负担会超大。那些controller共享了那些数据会很模糊。而且测试非常空难。最后一条对于不正经的js开发人员, 估计不是什么问题。
26+
27+ ## Elegant 优雅的方法
28+
29+ 什么才不是血腥的呢?angularjs最突出的特殊之一就是DI, 也就是注入, 利用factory把需要共享的数据注入给需要的controller可以干净漂亮的解决这个问题。
30+
31+ ``` js
32+ var myApp = angular .module (" myApp" , []);
33+ myApp .factory (' Data' , function () {
34+ return {
35+ name: " Ting"
36+ }
37+ });
38+ myApp .controller (' FirstCtrl' , function ($scope , Data ) {
39+ $scope .data = Data;
40+
41+ $scope .setName = function () {
42+ Data .name = " Jack" ;
43+ }
44+ });
45+
46+ myApp .controller (' SecondCtrl' , function ($scope , Data ) {
47+ $scope .data = Data;
48+
49+ $scope .setName = function () {
50+ Data .name = " Moby" ;
51+ }
52+ });
53+ ```
54+
55+ ok
56+ 就是这么简单, 自己试试之后再感谢我吧
57+
58+ demo: [ http://plnkr.co/edit/6cLn0LXTu16AwJeiCqtn?p=preview ] [ 1 ]
59+
60+
61+ [ 1 ] : http://plnkr.co/edit/6cLn0LXTu16AwJeiCqtn?p=preview
You can’t perform that action at this time.
0 commit comments