Skip to content

Commit f8a6093

Browse files
committed
Add two more articles.
1 parent 0240f0d commit f8a6093

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

decorator.markdown

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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)
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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

0 commit comments

Comments
 (0)