写在前面

关于angularjs的路由的概念基本上这篇就要结束了,通过学习,以及在实际项目中的实践,还是比较容易上手的。自己也通过angularjs做了一个在app上的一个模块,效果还是可以的。

系列文章

[Angularjs]ng-select和ng-options

[Angularjs]ng-show和ng-hide

[Angularjs]视图和路由(一)

[Angularjs]视图和路由(二)

[Angularjs]视图和路由(三)

路由模式

不同的路由模式在浏览器的地址栏中会以不同的URL格式呈现。$location服务默认会使用标签模式来进行路由。路由模式决定你的站点的URL长成什么样子。

标签模式

标签(hashbang)是angularjs用来同你的应用内部进行链接的技巧。标签模式是HTML5模式的降级方案,URL路径会以#符号开头。标签模式不需要重写<a href=''></a>标签,也不需要任何服务器端的支持。如果没有进行额外的指定,AngularJS将默认使用标签模式。

使用标签模式的URL看起来是这样的:

http://yoursite.com/#!/inbox/all

如果要显示指定配置并使用标签模式,需要在应用模块的config函数中进行配置:

angular.module('app',['ngRoute'])
.config(['$locationProvider',function($locationProvider){
$locationProvider.html5Mode(false);
}]);

我们还可以配置hashPrefix,也就是标签模式下标签默认的前缀!符号。这个前缀也是angularjs在比较老的浏览器中降级机制的一部分。这个符号是可以配置的:

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

Html5模式

angularjs支持的另外一种路由模式是html5模式。在这个模式中,URL看起来和普通的URL一样(在老式浏览器中看起来还是使用标签的url)。例如,同意的路由在HTML5模式中看起来是这样的:

http://yoursite.com/inbox/all

在angularjs内部,$location服务通过html5历史api让应用能够使用普通的URL路径来路由。当浏览器不支持HTML5历史api时,$location服务会自动使用标签模式的URL作为替代方案。

$location服务还有一个有趣的功能,当一个支持html5历史api的现代浏览器加载了一个带标签的URL时,它会为用户重写这个URL。

在HTML5模式中,angularjs会负责重写<a href=''></a>中的链接。也就是说angularjs会根据浏览器能力在编译时决定是否重写href=''中的链接。

例如<a href='/person/42?all=true'>Person</a>这个标签,在老式浏览器中会被重写成标签模式的URL:/index.html#!/person/42?all=true。但在现代浏览器中会保持本来的样子。

后端服务器也需要支持URL重写,服务器需要确保所有请求都返回index.html。以支持html5模式。这样才能确保由angularjs应用来处理路由。

当html5模式的angularjs中写链接时,永远都不要使用相对路径。如果你的应用是在根路径中加载的,这不会有什么问题,但在其他路径中,angularjs应用就无法正确处理路由了。另一个选择是在HTML文档的head中用<base>标签来指定应用的基础URL:

<base href='/base/url'/>

路由事件

$route服务在路由过程中的每个阶段都会触发不同的事件,可以为这些不同的路由事件设置监听器并做出响应。

这个功能对于控制不同的路由时间,以及探测用户的登录和授权状态等场景是非常有用的。

我们需要给路由设置事件监听器,用$rootScope来监听这些事件。

$routeChangeStart

angularjs在路由变化之前会广播$routeChangeStart事件。在这一步中,路由服务会开始加载路由变化所需要的所有依赖,并且模板和resolve键中的promise也会被resolve。

angular.module('myapp',[])
.run(['$rootScope','$location',function($rootScope,$location){
$rootScope.$on('$routeChangeStart',fucntion(evt,next,current){
});
}]);

$routeChangeStart事件带有两个参数:
将要导航到的下一个URL.

路由变化前的URL。

$routeChangeSuccess

angularjs会在路由的依赖被加载后广播$routeChangeSuccess事件。

angular.module('myapp',[])
.run(['$rootScope','$location',function($rootScope,$location){
$rootScope.$on('$routeChangeSuccess',fucntion(evt,next,current){
});
}]);

$routeChangeSuccess有三个参数

原始的Angularjs evt对象。

用户当前所处的路由。

上一个路由(如果当前是第一个路由,则为undefined)。

$routeChangeError

angularjs会在任何一个promise被拒绝或者失败时广播$routeChangeError事件。

angular.module('myapp',[])
.run(['$rootScope','$location',function($rootScope,$location){
$rootScope.$on('$routeChangeError',fucntion(current,previous,rejection){
});
}]);

$routeChangeError事件有三个参数

当前路由信息。

上一个路由信息。

被拒绝的promise的错误信息。

$routeUpdate

angularjs在reloadOnSearch属性被设置为false的情况下,重新使用某个控制器的示例时,会广播$routeUpdate事件。

总结

在实际项目中,还没有用过,现将理论放在这里,用到了再总结吧。

本文来自

Angularjs权威教程

[Angularjs]视图和路由(四)的更多相关文章

  1. [Angularjs]视图和路由(二)

    写在前面 上篇文章主要介绍了视图和路由的基本概念,并在文章最后举了一个简单的使用案例.这篇文章将继续学习路由的配置,及相关参数的说明. 系列文章 [Angularjs]ng-select和ng-opt ...

  2. [Angularjs]视图和路由(三)

    写在前面 上篇文章主要介绍了路由中when方法的第二个参数,常见的几个属性,以及作用.本篇文章,将介绍和路由相关的几个常见的服务. 系列文章 [Angularjs]ng-select和ng-optio ...

  3. [Angularjs]视图和路由(一)

    写在前面 对单页应用来讲,视图和路由的作用可以从一个视图跳转到另外一个视图,可以合理管理用户在使用过程中看到的界面. 将视图分解成布局和模版视图,并且根据用户当前访问的URL来展示对应的视图,将会是一 ...

  4. AngularJS 视图和路由

    在AngularJS之后引用angular-route  路由   ngRoute模块加载声明   AngularJS提供的when和otherwise两个方法来定义应用的路由   otherwise ...

  5. AngularJs多重视图和路由的使用

    使用AngularJs来做多重视图和路由是在方便不过了,在开发过程中,都有许多的页面,而这些页面都有相同的部分,比如页面的头部和尾部通常都是一样的,变化的都是主体部分,还有就是一些后端管理的一些项目, ...

  6. AngularJS ui-router (嵌套路由)

    http://www.oschina.net/translate/angularjs-ui-router-nested-routes AngularJS ui-router (嵌套路由) 英文原文:A ...

  7. [转]AngularJS ui-router (嵌套路由)

    本文转自:http://www.oschina.net/translate/angularjs-ui-router-nested-routes http://www.codeproject.com/A ...

  8. AngularJS 的嵌套路由 UI-Router

    AngularJS 的嵌套路由 UI-Router 本篇文章翻译自:https://scotch.io/tutorials/angular-routing-using-ui-router 演示网站请查 ...

  9. 关于AngularJs中的路由学习总结

    AngularJs中的路由,应用比较广泛,主要是允许我们通过不同的url访问不同的内容,可实现多视图的单页web应用.下面看看具体怎么使用. 关于路由  通常我们的URL形式为http://jtjds ...

随机推荐

  1. 为Ubuntu笔记本电脑设置WiFi热点共享上网

    该文由土木坛子转译而来,说是转译,其实看截图就可以方便的设置,没有任何命令,全是图形界面,方便容易.我们都知道怎样在 windows 7 系统上如何设计 Wifi 热点,当你只有一条网线,多台计算机的 ...

  2. ODAC(V9.5.15) 学习笔记(十七)主从模式

    主从模式(Master/Detail mode)是指建立主表和从表关系的多个数据集集合模式. 1. 关系设置 要设置主从模式,必须有一个主表数据集(TDataSet)和一个从表数据集(TDataSet ...

  3. Android开发艺术探索笔记—— View(一)

    Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...

  4. java框架篇---spring hibernate整合

    在会使用hibernate 和spring框架后 两个框架的整合就变的相当容易了, 为什么要整合Hibernate?1.使用Spring的IOC功能管理SessionFactory对象 LocalSe ...

  5. `fw服务端非完整` 工程开发初期的工作

    前面写到了一些关于cocos2dx在开发中的一些模块以及一些解决方法,那些都属于本人的个人简介和个人倾向的解决方案.最近这几天我完善了一下ui解析的部分,当然也只是抽出一点点时间去做的这件事情.我添加 ...

  6. 技术总结之SpringIOC

    1)SpringIOC核心模拟实现 思路:初始化Spring容器时,从配置文件中读取定义好的Bean的信息,根据配置属性初始化后存入Spring容器中. 当需要某个Bean时,直接从容器中通过id获取 ...

  7. AngularJS 监控对象属性:$watch和$digest

    监控对象属性:$watch和$digest $watch和$digest是相辅相成的.两者一起,构成了Angular作用域的核心:数据变化的响应.如果你学习过WPF,并基于WPF使用过一些MVVM框架 ...

  8. 基于kubernetes构建Docker集群管理详解-转

    http://blog.liuts.com/post/247/ 一.前言        Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ...

  9. 剑指架构师系列-Struts2构造函数的循环依赖注入

    Struts2可以完成构造函数的循环依赖注入,来看看Struts2的大师们是怎么做到的吧! 首先定义IBlood与BloodImpl类: public interface IBlood { } pub ...

  10. Robot Framework自动化测试(三)---Selenium API

    Robot  Framework  Selenium  API 说明: 此文档只是将最常用的UI 操作列出.更多方法请查找selenium 关键字库. 一.浏览器驱动 通过不同的浏览器执行脚本. Op ...