AngularJS - 路由入門

咱們有不少方法讓一個視圖隨着用戶的操做進行變化。
可是,只是單單一個視圖就要知足全部的需求會讓代碼變得很是複雜。
也許咱們可使用ng-include來引用各類模板,但這隻限於部分場景。html

因而咱們能夠將視圖拆分爲兩種:html5

  • 佈局視圖
  • 模板視圖

如此一來,咱們即可以使用route實現模板和佈局視圖的組裝,以構建多視圖的應用。windows

Route

ngRoutes並不屬於核心模塊,咱們須要額外引用angular-route.js,並在聲明應用時:瀏覽器

var myApp = angular.module('myApp',['ngRoute']);

 

$routeProvider

route須要經過$routeProvider定義,好比這樣:ide

var myApp = angular.module('myApp', ['ngRoute'])
.config(['$routeProvider', function($routeProvider) {
    $routeProvider
    .when('/', {
        template: '<h2>contacts</h2>',
        controller: 'myController'
    })
    .when('/contacts', {
        templateUrl: 'contacts.html',
        controller: 'contactsController'
    })
    .when('/contacts/:userId', {
        templateUrl: 'contact.html',
        controller: 'contactController'
    })
    .otherwise({redirectTo: '/'});
}]);


OMG,這種定義方式太晦澀了,咱們不能像定義指令時用directive()那樣用route()什麼的嗎?
其實directive()什麼的都是config()的語法糖。函數

好比咱們這樣聲明一個指令:佈局

var myApp = angular.module('myApp', [])
.directive('myDirective', function() {
    return {
        template: '<p>Kavlez</p>'
    };
});

實際上是:url

var myApp = angular.module('myApp', [])
.config(function($compileProvider){
    $compileProvider.directive('myDirective', function() {
        return {
            template: '<p>Kavlez</p>'
        };
    });
});


provider用來實例化依賴並對外提供API,好比這裏的$route服務就是經過相應的$routeProvider對外提供API,好比when(),咱們經過這些API設置路由規則。code

另外,provider是怎麼來的?
Injector對module進行配置時,會在這些module中註冊全部定義的provider,必要時會注入服務,而服務的實例化則須要provider來進行。htm

路由模式

不一樣的路由模式下URL會以不一樣的格式呈現,咱們有兩種模式能夠選擇。

  • 標籤模式
    AngularJS默認使用這個模式,這個模式下URL會以'#'開頭。

  • html5模式
    這個模式下的URL和通常的沒什麼區別,若是選擇了該模式,AngularJS會根據瀏覽器重寫全部的<a href=""></a>

路由模式也經過$routeProvider進行設置,好比:

var myApp = angular.module('myApp', ['ngRoute'])
 .config(['$locationProvider', function($locationProvider) {
     $locationProvider.html5Mode(false);
     $locationProvider.hashPrefix('!');
 }])

 

when

這裏使用的when(path,route)一共兩個參數。

  • path比較好理解,也就是路由路徑,和$location.path匹配,後面帶上:則表示參數,能夠傳遞給$routeParams
  • route指的是path匹配後的動做,是一個對象,屬性有:
    • controller (string/function):在這裏聲明的控制器會獲得路由建立的做用域。
    • template (string):HTML模板渲染到聲明瞭ng-view的元素裏。
    • templateURL (string):功能和template同樣,只是經過XHR得到模板。
    • resolve : 將列表對象注入到controller中。
    • redirectTo (string/function): 用於替換path。比起用做字符串,函數更有意義。
    • reloadOnSearch (boolean):默認是true,也就是$location.search()發生變化時從新加載路由。

 

ng-view

咱們用ng-view接收對應的視圖模板,給$route對應的視圖佔位。
mg-view的優先級爲1000,也就是說AngularJS不會運行同一個元素上的低優先級指令。


ngView指令遵循如下規則。

  • 每次觸發$routeChangeSuccess事件,視圖都會更新。
  • 若是某個模板同當前的路由相關聯:
    • 建立一個新的做用域;
    • 移除上一個視圖,同時上一個做用域也會被清除;
    • 將新的做用域同當前模板關聯在一塊兒;
    • 若是路由中有相關的定義,那麼就把對應的控制器同當前做用域關聯起來;
    • 觸發$viewContentLoaded事件;
    • 若是提供了onload屬性,調用該屬性所指定的函數。

 

$location

既然涉及到了路徑,就不得不說$location服務。
感受和windows.location差很少,但$location只能用來在內部訪問路由,沒法刷新整個頁面。

下面列出$location的經常使用的一些方法。

  • path()
    當前路徑:

    $location.path();

    跳轉至:

    $location.path('/');
  • replace()
    這個方法可讓用戶沒法後退,好比這樣:

    $location.path('/').replace();
  • absUrl() : 獲取絕對路徑
  • hash() : 獲取URL中的hash片斷
  • host() : 獲取host
  • port() : 獲取端口號
  • protocol() : 獲取協議
  • search() :
    用於設置URL中的查詢參數,好比:

    $location.search({id:'000000',name:'Kavlez'});
    $location.search('id=000000&name=Kavlez');
  • url() : 獲取當前URL,或者修改當前URL

event

有幾個路由相關的事件以下:

  • $routeChangeStart : 路由變化以前會觸發該事件,有三個參數,分別是AngularJS事件對象、將要路由的url、當前url。

    $rootScope.$on('$routeChangeStart', function(evt, next, current) {
        //something
    });
  • $routeChangeSuccess : 路由成功後觸發,三個參數分別爲AngularJS事件對象、當前url、上一個url
  • $routeChangeError : 被拒時觸發,三個參數爲當前路由信息、上一個路由的信息、錯誤信息。
  • $routeUpdate : 若是reloadOnSearch爲false,從新使用控制器的實力時觸發。
相關文章
相關標籤/搜索