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在注入器建立後會執行這個函數。