angularjs中模块的value()方法可以对模块数据模型进行扩展,使得不同controller可以进行通信,
充当全局变量的作用。使用示例:
1 | var app=angular.module('app',[]); |
跟我们之前分析过的decorator一样,value方法内部实际上也是调用$provide.value函数,我们先看看
moduleInstance的value方法:
1 | var moduleInstance = { |
可以清楚的看到,调用1
2
3
4
5
6
7loadModules的时候再调用$provide.value方法
```js
//用个valueFn包装下,返回内部带有val的方法valueRef
function value(name, val) { return factory(name, valueFn(val), false); }
function valueFn(value) {return function valueRef() {return value;};}
factory方法我们之前分析过,内部会把1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
我们有时候会调用```$rootElement```这个对象,那找遍了angular内部并没有显示的声明$rootElementProvider方法,那么它到底存储在哪呢?
它就是在angular启动的时候调用```doBootstrap```的时候压入modules数组顶部然后调用的$provide.value把找到的ng-app元素用jqLite包装成jqLite对象,
然后放入全局变量$rootElement中,代码如下:
```js
//传入的modules 比如html中定义的ng-app="myApp"
//那么为["myApp"]
//正常的话 这时 modules已经初始化
modules = modules || [];
//unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
modules.unshift(['$provide', function($provide) {
//调用$provide方法
//设置$rootElement
$provide.value('$rootElement', element);
}]);
下篇我们分析下angular的启动函数doBootStrap或者jqLite对象中的扩展方法或者一些常用函数。