Page 116 - AngularJS权威教程
P. 116

96  第 11 章  AngularJS 模块加载


             注入一个尚未注册的提供者。


                         唯一例外的是constant()方法,这个方法总会在所有配置块之前被执行。


                 当对模块进行配置时,需要格外注意只有少数几种类型的对象可以被注入到config()函数
             中:提供者和常量。如果我们将一个服务注入进去,会在真正对其进行配置之前就意外地把服务
             实例化了。

                 这种对配置服务进行严格限制的另外一个副作用就是,我们只能注入用provider()语法构
             建的服务,其他的则不行。

                 更多关于用provider()语法构建服务的内容,请查看第14章。
                 这些config()代码块可以对我们的服务进行自定义配置,例如设置API密钥或自定义URL等。

                 也可以定义多个配置块,它们会按照顺序执行,这样就可以将应用不同阶段的配置代码集中
             在不同的代码块中。

                 angular.module('myApp', [])
                 .config(function($routeProvider) {
                     $routeProvider.when('/', {
                         controller: 'WelcomeController',
                         template: 'views/welcome.html'
                     });
                 })
                 .config(function(ConnectionProvider) {
                     ConnectionProvider.setApiKey('SOME_API_KEY');
                 });

                 config()函数接受一个参数。
                  configFunction(函数):AngularJS在模块加载时会执行这个函数。


             11.2 运行块


                 和配置块不同,运行块在注入器创建之后被执行,它是所有AngularJS应用中第一个被执行
             的方法。
                 运行块是AngularJS中与main方法最接近的概念。运行块中的代码块通常很难进行单元测试,
             它是和应用本身高度耦合的。

                 运行块通常用来注册全局的事件监听器。例如,我们会在.run()块中设置路由事件的监听器
             以及过滤未经授权的请求。

                 假设我们需要在每次路由发生变化时,都执行一个函数来验证用户的权限,放置这个功能唯
             一合理的地方就是run方法:

                 angular.module('myApp', [])
                 .run(function($rootScope, AuthService) {
                     $rootScope.$on('$routeChangeStart', function(evt, next, current) {
                         // 如果用户未登录
                         if (!AuthService.userLoggedIn()) {
   111   112   113   114   115   116   117   118   119   120   121