在谈路由机制前有必要先提一下现在比较流行的单页面应用,就是所谓的single page APP。为了实现无刷新的视图切换,我们通常会用ajax请求从后台取数据,然后套上HTML模板渲染在页面上,然而ajax的一个致命缺点就是导致浏览器后退按钮失效,尽管我们可以在页面上放一个大大的返回按钮,让用户点击返回来导航,但总是无法避免用户习惯性的点后退。解决此问题的一个方法是使用hash,监听hashchange事件来进行视图切换,另一个方法是用HTML5的history API,通过pushState()记录操作历史,监听popstate事件来进行视图切换,也有人把这叫pjax技术。基本流程如下:
如此一来,便形成了通过地址栏进行导航的深度链接(deeplinking),也就是我们所需要的路由机制。通过路由机制,一个单页应用的各个视图就可以很好的组织起来了。
ngRoute包括的内容
ng的路由机制是靠ngRoute提供的,通过hash和history两种方式实现了路由,可以检测浏览器是否支持history来灵活调用相应的方式。ng的路由(ngRoute)是一个单独的模块,包含以下内容:
- 服务$routeProvider用来定义一个路由表,即地址栏与视图模板的映射
- 服务$routeParams保存了地址栏中的参数,例如{id : 1, name : 'tom'}
- 服务$route完成路由匹配,并且提供路由相关的属性访问及事件,如访问当前路由对应的controller
- 指令ngView用来在主视图中指定加载子视图的区域
以上内容再加上$location服务,我们就可以实现一个单页面应用了。下面来看一下具体如何使用这些内容。
使用ng的路由机制
第一步:引入文件和依赖
ngRoute模块包含在一个单独的文件中,所以第一步需要在页面上引入这个文件,如下:
<script src="http://code.angularjs.org/1.2.5/angular.min.js"></script>
<script src="http://code.angularjs.org/1.2.5/angular-route.min.js"></script>
光引入还不够,我们还需在模块声明中注入对ngRoute的依赖,如下:
var app = angular.module('MyApp', ['ngRoute']);
完成了这些,我们就可以在模板或是controller中使用上面的服务和指令了。下面我们需要定义一个路由表。
第二步:定义路由表
$routeProvider提供了定义路由表的服务,它有两个核心方法,when(path,route)和otherwise(params),先看一下核心中的核心when(path,route)方法。
when(path,route)方法接收两个参数,path是一个string类型,表示该条路由规则所匹配的路径,它将与地址栏的内容($location.path)值进行匹配。如果需要匹配参数,可以在path中使用冒号加名称的方式,如:path为/show/:name,如果地址栏是/show/tom,那么参数name和所对应的值tom便会被保存在$routeParams中,像这样:{name : tom}。我们也可以用*进行模糊匹配,如:/show*/:name将匹配/showInfo/tom。
route参数是一个object,用来指定当path匹配后所需的一系列配置项,包括以下内容:
controller //function或string类型。在当前模板上执行的controller函数,生成新的scope
controllerAs //string类型,为controller指定别名
template //string或function类型,视图所用的模板,这部分内容将被ngView引用
templateUrl //string或function类型,当视图模板为单独的html文件或是使用了<script type="text/ng-template">定义模板时使用
resolve //指定当前controller所依赖的其他模块
redirectTo //重定向的地址
最简单情况,我们定义一个html文件为模板,并初始化一个指定的controller:
function emailRouteConfig($routeProvider){
$routeProvider.
when('/show', {
controller: ShowController,
templateUrl: 'show.html'
}).
when('/put/:name',{
controller: PutController,
templateUrl: 'put.html'
});
};
otherwise(params)方法对应路径匹配不到时的情况,这时候我们可以配置一个redirectTo参数,让它重定向到404页面或者是首页。
第三步:在主视图模板中指定加载子视图的位置
我们的单页面程序都是局部刷新的,那这个“局部”是哪里呢,这就轮到ngView出马了,只需在模板中简单的使用此指令,在哪里用,哪里就是“局部”。例如:
或:
我们的子视图将会在此处被引入进来。完成这三步后,你的程序的路由就配置好了。
用Route去战斗吧!
光看了上面的理论部分是不是觉得很抽象、不过瘾呢?为了满足大家的胃口,同时也巩固我学到的东西,我特地写了一个demo,模拟我们熟悉的新闻发布系统,使用了上面所介绍的知识。下面由demo华丽丽登场:
大标题和左侧部分都是不变的,只是右侧的内容在动态加载。并且每次切换不同的视图,浏览器地址栏的内容都相应变化,所以当你点击后退时,总是能回到上一步的视图。
由于博客的限制你在这里看不到地址栏变化,点击http://sandbox.runjs.cn/show/r72hgjwg查看真实运行效果。
查看demo的源码,点击这里http://runjs.cn/code/r72hgjwg
关于ng的路由机制就学习到这里的,总结一下,其实路由机制也不难,基本流程就是这样,但在没有真正用到项目中前,我也不知道这水到底有多深。本篇博客中的示例我抛弃了jsfiddle.net而用了runjs.cn,原因是jsfiddle简直慢的像蜗牛,并且angular.js的cdn貌似被墙了,文件一直下载不下来。总体感觉runjs.cn还是挺快的,就是一点不方便,你看源码还得切出去,木有办法啦,以后我发现更好的再把runjs给抛弃了~
分享到:
相关推荐
AngularJS UI.Router是一个强大的路由模块,它为AngularJS应用程序提供了更复杂的导航结构和状态管理功能。这个"angularjs ui.router嵌套路由demo"是展示如何在AngularJS项目中使用UI.Router进行多级路由配置和页面...
在本“AngularJS路由”示例中,我们将探讨如何设置和使用AngularJS的路由系统。 首先,我们需要引入AngularJS库和`ngRoute`模块。`ngRoute`是AngularJS官方提供的路由模块,提供了一套完整的路由解决方案。在HTML...
在AngularJS中,路由(Route)是实现页面导航和视图管理的关键组件。本教程将深入探讨AngularJS中的路由功能,以及如何在实际项目中应用。 路由在AngularJS中由`ngRoute`模块提供,它允许我们在不同的URL和视图之间...
在本项目中,"Maven之Spring Boot_angularJS--路由版"是一个综合性的Web应用开发实例,结合了三个核心的技术栈:Maven、Spring Boot和AngularJS。这个项目的目标是构建一个现代化的单页应用程序(SPA),通过...
AngularJS 嵌套路由:这是我针对同一个主题(ui-... ui-router和同属AngularJS框架一部分的ng-route一样强大. ui-router提供了让我们可以做路由嵌套和视图命名的特性. 我们将在示例中看到ui-router中存在的所有类型.
AngularJS 是一款强大的前端JavaScript框架...AngularJS的路由机制使应用更易于管理和维护,同时提供了更好的用户体验。在实际开发中,还可以利用更多的高级特性,如路由参数、路由守卫等,来实现更为复杂的路由需求。
在AngularJS中,路由机制主要由ngRoute模块来实现,通过定义不同的路由规则,使得用户可以在单页应用中通过改变浏览器地址栏的URL来实现页面的跳转,而不产生全页面的重新加载。本文将深入探讨AngularJS的路由机制,...
在AngularJS中,`$route`服务是路由管理的核心组件,它允许开发者定义和管理应用程序的不同视图(views)与URL之间的映射。在本教程中,我们将深入探讨`$route`路由的基本概念、配置以及如何在实践中应用。 ### 1. ...
AngularJS路由机制使得单页面应用能够有效地组织和管理不同页面的逻辑,通过URL与视图、控制器之间的映射,实现了动态内容加载和无刷新导航。了解并熟练掌握路由配置、动态参数、路由事件以及路由懒加载等技巧,将有...
**标题解析:** "NG-Book 2 The Complete Book on AngularJS 2 r33 Code" 是一本关于AngularJS 2.0的完整教程的配套源代码,版本为r33。这个标题揭示了该资源是针对AngularJS 2的一个详细学习资料,包含了实践示例...
开发者可以在控制器中访问与路由关联的数据,并在视图中使用AngularJS的绑定机制将这些数据展示给用户。当用户点击链接或者执行某些操作触发路由变化时,ng-view会根据新的路由规则加载对应的视图内容。 在实际开发...
在AngularJS中,路由是应用导航的核心组成部分,它允许用户在不同的视图间跳转,同时保持数据状态。本文将深入讲解如何在AngularJS的路由中传递参数,这对于构建动态和交互性强的单页应用程序(SPA)至关重要。 ...
在AngularJS中,路由的概念是实现单页面应用的关键组件之一,它允许用户在不同的视图间切换,而无需重新加载整个页面,从而提高了应用的响应速度和用户体验。 在单页面应用中,当用户点击链接或者执行某些操作需要...
在本文中,我们将深入探讨如何使用AngularJS、路由、Visual Studio (VS) 和 .NET 搭建一个Web项目。AngularJS 是一个强大的前端JavaScript框架,用于构建动态单页应用程序(SPA)。路由是AngularJS中的核心特性,它...
在阅读和学习过程中,配合"ng-book 2(The Complete Book On AngularJS 2) r41 含中文翻译"这份压缩包文件,可以更全面地理解AngularJS 2的各项特性和最佳实践。文件中的中文翻译使得国内开发者无需语言障碍,能更好...
总结来说,AngularJS的路由切换关键在于配置`$routeProvider`,定义URL与模板之间的映射,并通过`ng-view`在页面上展示对应的模板。此外,本地开发时需要一个简单的服务器环境来支持路由功能。理解并熟练掌握这些...
【一】Angular 路由状态发生改变时可以通过’ $stateChangeStart ‘、’ $stateChangeSuccess ‘、’ $stateChangeError ‘监听,通过注入’$location’实现状态的管理 代码示例如下: function run($...