Page 126 - AngularJS权威教程
P. 126
106 第 12 章 多重视图和路由
在HTML5模式中,AngularJS会负责重写<a href=""></a>中的链接。也就是说AngularJS会
根据浏览器的能力在编译时决定是否要重写href=""中的链接。
例如<a href="/person/42?all=true">Person</a>这个标签,在老式浏览器中会被重写成
标签模式的URL:/index.html#!/person/42?all=true。但在现代浏览器中会URL会保持本来
的样子。
后端服务器也需要支持URL重写,服务器需要确保所有请求都返回index.html,以支持HTML5
模式。这样才能确保由AngularJS应用来处理路由。
当在HTML5模式的AngularJS中写链接时,永远都不要使用相对路径。如果你的应用是在根
路径中加载的,这不会有什么问题,但如果是在其他路径中,AngularJS应用就无法正确处理路
由了。
另一个选择是在HTML文档的HEAD中用<base>标签来指定应用的基础URL:
<base href="/base/url" />
12.5.2 路由事件
$route服务在路由过程中的每个阶段都会触发不同的事件,可以为这些不同的路由事件设置
监听器并做出响应。
这个功能对于控制不同的路由事件,以及探测用户的登录和授权状态等场景是非常有用的。
我们需要给路由设置事件监听器,用$rootScope来监听这些事件。
1. $routeChangeStart
AngularJS在路由变化之前会广播$routeChangeStart事件。在这一步中,路由服务会开始加
载路由变化所需要的所有依赖,并且模板和resolve键中的promise也会被resolve。
angular.module('myApp', [])
.run(['$rootScope', '$location', function($rootScope, $location) {
$rootScope.$on('$routeChangeStart', function(evt, next, current) {
});
}]);
$routeChangeStart事件带有两个参数:
将要导航到的下一个URL;
路由变化前的URL。
2. $routeChangeSuccess
AngularJS会在路由的依赖被加载后广播$routeChangeSuccess事件。
angular.module('myApp', [])
.run(['$rootScope', '$location', function($rootScope, $location) {
$rootScope.$on('$routeChangeSuccess', function(evt, next, previous) {
});
}]);
$routeChangeStart事件带有三个参数: