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事件带有三个参数:
   121   122   123   124   125   126   127   128   129   130   131