AngularJS中的run方法初始化全局数据,只对全局做用域起做用,如$rootScope.多个控制器之间能够共享数据,以下代码所示:javascript
<script type="text/javascript"> var m1 = angular.module('myApp',[]); m1.run(['$rootScope',function($rootScope){ $rootScope.name = 'hello'; }]); console.log( m1 ); </script>
在模块的加载阶段,AngularJS会在提供者注册和配置的过程当中对模块进行配置。在整个AngularJS的工做流中,这个阶段是惟一可以在应用启动前进行修改的部分。html
angular.module('myApp', []) .config(function($provide) { });
这本书的大部份内容都在使用config()
函数的语法糖,并在配置阶段执行。例如,咱们在某个模块之上建立一个服务或指令时:java
angular.module('myApp', []).factory('myFactory', function(){ var service = {}; return service; }) .directive('myDirective', function(){ return { template: '<button>Click me</button>' } })
AngularJS会在编译时执行这些辅助函数。它们在功能上等同于下面的写法:ide
angular.module('myApp', []) .config(function($provide ,$compileProvider) { $provide.factory('myFactory', function() { var service = {}; return service; }); $compileProvider.directive('myDirective', function() { return { template: '<button>Click me</button>' }; }); });
须要特别注意,AngularJS会以这些函数书写和注册的顺序来执行它们。也就是说咱们没法注入一个还没有注册的提供者。函数
惟一例外的是
constant()
方法,这个方法总会在全部配置块以前被执行。单元测试
当对模块进行配置时,须要格外注意只有少数几种类型的对象能够被注入到config()
函数中:提供者和常量。若是咱们将一个服务注入进去,会在真正对其进行配置以前就意外地把服务实例化了。测试
这种对配置服务进行严格限制的另一个反作用就是,咱们只能注入用provider()
语法构建的服务,其余的则不行。spa
更多关于用provider()
语法构建服务的内容,请查看第14章。code
这些config()
代码块能够对咱们的服务进行自定义配置,例如设置API密钥或自定义URL等。htm
也能够定义多个配置块,它们会按照顺序执行,这样就能够将应用不一样阶段的配置代码集中在不一样的代码块中。
angular.module('myApp', ['ngRoute']) .config(function($routeProvider) { $routeProvider.when('/', { controller: 'WelcomeController', template: 'views/welcome.html' }); }) .config(function(ConnectionProvider) { ConnectionProvider.setApiKey('SOME_API_KEY'); });
config()
函数接受一个参数。
configFunction
(函数):AngularJS在模块加载时会执行这个函数。
1.3及以后的版本,全部的
.config
块都在.provider
运行以后运行。这意味着不能使用.config
来配置“下游”provider。在任何状况下这都不是一种好的作法,在v1.3+中这么作是行不通的。
和配置块不一样,运行块在注入器建立以后被执行,它是全部AngularJS应用中第一个被执行的方法。
运行块是AngularJS中与main
方法最接近的概念。运行块中的代码块一般很难进行单元测试,它是和应用自己高度耦合的。
运行块一般用来注册全局的事件监听器。例如,咱们会在.run()
块中设置路由事件的监听器以及过滤未经受权的请求。
假设咱们须要在每次路由发生变化时,都执行一个函数来验证用户的权限,放置这个功能惟一合理的地方就是run
方法:
angular.module('myApp', ['ngRoute']) .run(function($rootScope, AuthService) { $rootScope.$on('$routeChangeStart', function(evt, next, current) { // 若是用户未登陆 if (!AuthService.userLoggedIn()) { if (next.templateUrl === "login.html") { // 已经转向登陆路由所以无需重定向 } else { $location.path('/login'); } } }); });
run()
函数接受一个参数。
initializeFn
(函数)AngularJS在注入器建立后会执行这个函数。