AngularJS配置.run()塊中設置路由事件的監聽器以及過濾未經受權的請求

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+中這麼作是行不通的。

11.2 運行塊

和配置塊不一樣,運行塊在注入器建立以後被執行,它是全部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在注入器建立後會執行這個函數。
相關文章
相關標籤/搜索