我们有很多方法让一个视图随着用户的操作进行变化。
但是,只是单单一个视图就要满足所有的需求会让代码变得非常复杂。
也许我们可以使用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 - 路由入门的更多相关文章

  1. [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程

    这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 AngularJS“路由”的定义概念 AngularJS最近真的很火,很多同事啊同学 ...

  2. AngularJS 路由

    AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 通过 AngularJS 可以实现多视图的单页Web应用(single page web application,SPA). 通常 ...

  3. Angularjs路由需要了解的那点事

    Angularjs路由需要了解的那点事 我们知道angularjs是特别适合单页面应用,为了通过单页面完成复杂的业务功能,势必需要能够从一个视图跳转到另外一个视图,也就是需要在单个页面里边加载不同的模 ...

  4. AngularJS快速入门指南20:快速参考

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  5. AngularJS快速入门指南19:示例代码

    本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...

  6. AngularJS快速入门指南18:Application

    是时候创建一个真正的AngularJS单页面应用程序了(SPA). 一个AngularJS应用程序示例 你已经了解了足够多的内容来创建第一个AngularJS应用程序: My Note Save Cl ...

  7. AngularJS快速入门指南17:Includes

    使用AngularJS,你可以在HTML中包含其它的HTML文件. 在HTML中包含其它HTML文件? 当前的HTML文档还不支持该功能.不过W3C建议在后续的HTML版本中增加HTML import ...

  8. AngularJS快速入门指南16:Bootstrap

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

  9. AngularJS快速入门指南15:API

    thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...

随机推荐

  1. Lighttpd

    一.简介 Lighttpd 是一个德国人领导的开源Web服务器软件,其根本的目的是提供一个专门针对高性能网站,安全.快速.兼容性好并且灵活的web server环境.具有非常低的内存开销,cpu占用率 ...

  2. I Hate It(线段数组基础题)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. top命令使用详解

    1.top命令查看服务器负载情况,CPU使用率,进程数等信息. 0.0% wa IO等待占用CPU的百分比 86.9% id  表示空闲的CPU占比 load average数据是每隔5秒钟检查一次活 ...

  4. C语言使用宏实现2个变量的交换

    记录哪个方法更普适,更高效,这些方法不包括使用函数的方法,如果使用函数的话,使用指针的方法更合适. 使用中间变量 形如 int tmp, tmp = a; a=b; b = tmp; #define ...

  5. lvs realserver 配置VIP

    # $# 表示提供到shell脚本或者函数的参数总数: # 1表示只有一个参数. #/bin/bash #file: tun_RS.sh if [ $# -ne 1 ]; then echo “usa ...

  6. [转]响应式网页设计:rem、em设置网页字体大小自适应

    本文转自:http://www.cnblogs.com/aimyfly/archive/2013/07/19/3200742.html 「rem」是指根元素(root element,html)的字体 ...

  7. hihocoder-1391&&北京网赛09 Countries(优先队列)

    题目链接: Countries 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There are two antagonistic countries, country ...

  8. jquery和css自定义video播放控件

    下面介绍一下通过jquery和css自定义video播放控件. Html5 Video是现在html5最流行的功能之一,得到了大多数最新版本的浏览器支持.包括IE9,也是如此.不同的浏览器提供了不同的 ...

  9. HDU 5084 HeHe --找规律

    题意: 给出矩阵M,求M*M矩阵的r行c列的数,每个查询跟前一个查询的结果有关. 解法: 观察该矩阵得知,令ans = M*M,则 ans[x][y] = (n-1-x行的每个值)*(n-1+y列的每 ...

  10. Spring 一二事(1)

    简单介绍一下spring,一方面带新手入入门,一方面自己也重温一下第一个小工厂先暂时不用maven,下一个会用maven来来配置 jar包只需要一个,spring版本为2.5(暂时为2.5,后续更新, ...