AngularJS - 路由入門
我們有很多方法讓一個視圖隨著用戶的操作進行變化。
但是,只是單單一個視圖就要滿足所有的需求會讓代碼變得非常復雜。
也許我們可以使用ng-include
來引用各種模板,但這只限於部分場景。
於是我們可以將視圖拆分為兩種:
如此一來,我們便可以使用route
實現模板和布局視圖的組裝,以構建多視圖的應用。
ngRoutes
並不屬於核心模塊,我們需要額外引用angular-route.js
,並在聲明應用時:
var myApp = angular.module('myApp',['ngRoute']);
route需要通過$routeProvider
定義,比如這樣:
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>'
};
});
其實是:
var myApp = angular.module('myApp', [])
.config(function($compileProvider){
$compileProvider.directive('myDirective', function() {
return {
template: '<p>Kavlez</p>'
};
});
});
provider
用來實例化依賴並對外提供API,比如這裡的$route
服務就是通過相應的$routeProvider
對外提供API,比如when()
,我們通過這些API設置路由規則。
另外,provider
是怎麼來的? Injector
對module進行配置時,會在這些module中注冊所有定義的provider,必要時會注入服務,而服務的實例化則需要provider來進行。
不同的路由模式下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(path,route)
一共兩個參數。
$location.path
匹配,後面帶上:
則表示參數,可以傳遞給$routeParams
。ng-view
的元素裡。template
一樣,只是通過XHR獲得模板。
我們用ng-view
接收對應的視圖模板,給$route
對應的視圖占位。mg-view
的優先級為1000,也就是說AngularJS不會運行同一個元素上的低優先級指令。
ngView指令遵循以下規則。
既然涉及到了路徑,就不得不說$location
服務。
感覺和windows.location
差不多,但$location
只能用來在內部訪問路由,無法刷新整個頁面。
下面列出$location
的常用的一些方法。
path()
當前路徑:
$location.path();
跳轉至:
$location.path('/');
replace()
這個方法可以讓用戶無法後退,比如這樣:
$location.path('/').replace();
search() :
用於設置URL中的查詢參數,比如:
$location.search({id:'000000',name:'Kavlez'});
$location.search('id=000000&name=Kavlez');
有幾個路由相關的事件如下:
$routeChangeStart : 路由變化之前會觸發該事件,有三個參數,分別是AngularJS事件對象、將要路由的url、當前url。
$rootScope.$on('$routeChangeStart', function(evt, next, current) {
//something
});
reloadOnSearch
為false,重新使用控制器的實力時觸發。
AngularJS權威教程 清晰PDF版 http://www.linuxidc.com/Linux/2015-01/111429.htm
希望你喜歡,並分享我的工作~帶你走近AngularJS系列:
如何在 AngularJS 中對控制器進行單元測試 http://www.linuxidc.com/Linux/2013-12/94166.htm
在 AngularJS 應用中通過 JSON 文件來設置狀態 http://www.linuxidc.com/Linux/2014-07/104083.htm
AngularJS 之 Factory vs Service vs Provider http://www.linuxidc.com/Linux/2014-05/101475.htm
AngularJS —— 使用 ngResource、RESTful APIs 和 Spring MVC 框架提交數據 http://www.linuxidc.com/Linux/2014-07/104402.htm
AngularJS 的詳細介紹:請點這裡
AngularJS 的下載地址:請點這裡