AngularJS - 路由入门
我们有很多方法让一个视图随着用户的操作进行变化。
但是,只是单单一个视图就要满足所有的需求会让代码变得非常复杂。  
也许我们可以使用ng-include来引用各种模板,但这只限于部分场景。
于是我们可以将视图拆分为两种:
- 布局视图
 - 模板视图
 
如此一来,我们便可以使用route实现模板和布局视图的组装,以构建多视图的应用。
Route
ngRoutes并不属于核心模块,我们需要额外引用angular-route.js,并在声明应用时:
var myApp = angular.module('myApp',['ngRoute']);
$routeProvider
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
这里使用的when(path,route)一共两个参数。
- path比较好理解,也就是路由路径,和
$location.path匹配,后面带上:则表示参数,可以传递给$routeParams。 - route指的是path匹配后的动作,是一个对象,属性有:
- controller (string/function):在这里声明的控制器会得到路由创建的作用域。
 - template (string):HTML模板渲染到声明了
ng-view的元素里。 - templateURL (string):功能和
template一样,只是通过XHR获得模板。 - resolve : 将列表对象注入到controller中。
 - redirectTo (string/function): 用于替换path。比起用作字符串,函数更有意义。
 - reloadOnSearch (boolean):默认是true,也就是$location.search()发生变化时重新加载路由。
 
 
ng-view
我们用ng-view接收对应的视图模板,给$route对应的视图占位。
mg-view的优先级为1000,也就是说AngularJS不会运行同一个元素上的低优先级指令。
ngView指令遵循以下规则。
- 每次触发$routeChangeSuccess事件,视图都会更新。
 - 如果某个模板同当前的路由相关联:
- 创建一个新的作用域;
 - 移除上一个视图,同时上一个作用域也会被清除;
 - 将新的作用域同当前模板关联在一起;
 - 如果路由中有相关的定义,那么就把对应的控制器同当前作用域关联起来;
 - 触发$viewContentLoaded事件;
 - 如果提供了onload属性,调用该属性所指定的函数。
 
 
$location
既然涉及到了路径,就不得不说$location服务。
感觉和windows.location差不多,但$location只能用来在内部访问路由,无法刷新整个页面。
下面列出$location的常用的一些方法。
path()
当前路径:$location.path();
跳转至:
$location.path('/');
replace()
这个方法可以让用户无法后退,比如这样:$location.path('/').replace();
- absUrl() : 获取绝对路径
 - hash() : 获取URL中的hash片段
 - host() : 获取host
 - port() : 获取端口号
 - protocol() : 获取协议
 search() :
用于设置URL中的查询参数,比如:$location.search({id:'000000',name:'Kavlez'});
$location.search('id=000000&name=Kavlez');
- url() : 获取当前URL,或者修改当前URL
 
event
有几个路由相关的事件如下:
$routeChangeStart : 路由变化之前会触发该事件,有三个参数,分别是AngularJS事件对象、将要路由的url、当前url。
$rootScope.$on('$routeChangeStart', function(evt, next, current) {
//something
});
- $routeChangeSuccess : 路由成功后触发,三个参数分别为AngularJS事件对象、当前url、上一个url
 - $routeChangeError : 被拒时触发,三个参数为当前路由信息、上一个路由的信息、错误信息。
 - $routeUpdate : 如果
reloadOnSearch为false,重新使用控制器的实力时触发。 
AngularJS - 路由入门的更多相关文章
- [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程
		
这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 AngularJS“路由”的定义概念 AngularJS最近真的很火,很多同事啊同学 ...
 - AngularJS 路由
		
AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常 ...
 - Angularjs路由需要了解的那点事
		
Angularjs路由需要了解的那点事 我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模 ...
 - AngularJS快速入门指南20:快速参考
		
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
 - AngularJS快速入门指南19:示例代码
		
本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...
 - AngularJS快速入门指南18:Application
		
是时候创建一个真正的AngularJS单页面应用程序了(SPA). 一个AngularJS应用程序示例 你已经了解了足够多的内容来创建第一个AngularJS应用程序: My Note Save Cl ...
 - AngularJS快速入门指南17:Includes
		
使用AngularJS,你可以在HTML中包含其它的HTML文件. 在HTML中包含其它HTML文件? 当前的HTML文档还不支持该功能.不过W3C建议在后续的HTML版本中增加HTML import ...
 - AngularJS快速入门指南16:Bootstrap
		
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
 - AngularJS快速入门指南15:API
		
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
 
随机推荐
- C++ 第一个C++程序
			
#include <iostream> // C++自带的标准头文件都是没有.h的 // 就相当于C语言的<stdio.h> // 提前使用命名空间std using name ...
 - [转]Flash ActionScript2.0面向对象游戏开发-推箱子
			
本文转自:http://www.alixixi.com/Dev/W3C/Flash/2007/2007070868666.html 概述: Flash ActionScript2.0是一种面向对向的编 ...
 - Java性能调优笔记
			
Java性能调优笔记 调优步骤:衡量系统现状.设定调优目标.寻找性能瓶颈.性能调优.衡量是否到达目标(如果未到达目标,需重新寻找性能瓶颈).性能调优结束. 寻找性能瓶颈 性能瓶颈的表象:资源消耗过多. ...
 - NOIP2008 普及组T2 排座椅 解题报告-S.B.S
			
题目描述 上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情.不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳.同学 ...
 - Network client/server
			
<Beginning Linux Programming_4th> chapter 15 Sockets 1 A simple local client/server 1) clie ...
 - bzoj-2748 2748: [HAOI2012]音量调节(dp)
			
题目链接: 2748: [HAOI2012]音量调节 Time Limit: 3 Sec Memory Limit: 128 MB Description 一个吉他手准备参加一场演出.他不喜欢在演出 ...
 - POJ 3264 Balanced Lineup -- RMQ或线段树
			
一段区间的最值问题,用线段树或RMQ皆可.两种代码都贴上:又是空间换时间.. RMQ 解法:(8168KB 1625ms) #include <iostream> #include < ...
 - java 20 - 9  带有缓冲区的字节输出流和字节输入流
			
由之前字节输入的两个方式,我们可以发现,通过定义数组读取数组的方式比一个个字节读取的方式快得多. 所以,java就专门提供了带有缓冲区的字节类: 缓冲区类(高效类) 写数据:BufferedOutpu ...
 - R语言-merge和rbind
			
rbind 使用方式 合并两个数据集,要求两个数据集的列数相等: rbind(parameter1,parameter2) 1 1 合并多个数据集,各个数据集的列数相等: rbind(paramete ...
 - css继承性和不继承的属性。
			
在CSS中并不是所有的属性都是能够继承的,因此在使用时一定要了解哪些是能够继承的哪些是不能够继承的.visibility和cursor能够被所有元素继承:letter-spacing,word-spa ...