咱們有不少方法讓一個視圖隨着用戶的操做進行變化。
可是,只是單單一個視圖就要知足全部的需求會讓代碼變得很是複雜。
也許咱們可使用ng-include
來引用各類模板,但這隻限於部分場景。html
因而咱們能夠將視圖拆分爲兩種:html5
如此一來,咱們即可以使用route
實現模板和佈局視圖的組裝,以構建多視圖的應用。windows
ngRoutes
並不屬於核心模塊,咱們須要額外引用angular-route.js
,並在聲明應用時:瀏覽器
var myApp = angular.module('myApp',['ngRoute']);
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(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,從新使用控制器的實力時觸發。