ngRoute 和 ui.router 的使用方法和区别
在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的。本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比。
ngRoute
使用方法
1) 引入 angular-route lib
无论是 ngRoute 还是 ui.router ,作为框架额外的附加功能,都必须以 模块依赖 的形式被引入。
1 |
<script src="lib/angular-route.js"></script> |
2) 配置路由
1 |
var app = angular.module('ngRouteApp', ['ngRoute']);
app.config(function($routeProvider){
|
服务与指令
ngRoute 路由模块名
$routeProvider 服务提供者,用来定义一个路由表,即地址栏与视图模板的映射,对应于ui.router 中的 urlRouterProvider 和 stateProvider
$route 服务,完成路由匹配,并且提供路由相关的属性访问及事件,如访问当前路由对应的 Controller,对应于下面的 $urlRouter 和 $state$routeParams 服务,保存了地址栏中的参数,对应于下面的 $stateParams
ng-view 指令,用来在主视图中指定加载子视图的区域,对应于下面的 ui-view
ui.router
使用方法
1) 引入 angular-ui-router lib
1 |
<script src="lib/angular-ui-router.min.js"></script> |
2) 配置路由
1 |
var app = angular.module("uiRouteApp", ["ui.router"]);
app.config(function($urlRouterProvider, $stateProvider) {
|
服务与指令
ui.router 路由模块名
$urlRouterProvider 服务提供者,用来配置路由重定向$stateProvider 服务提供者,用来配置路由
$urlRouter 服务$state 服务,用来显示当前路由状态信息,以及一些路由方法(如:跳转)$stateParams 服务,用来存储路由匹配时的参数
ui-view 指令,路由模板渲染,对应的 dom 相关联ui-sref 指令,链接到特定状态
路由的创建
基本配置
调用 $stateProvider.state(...) 方法,并可配置以下参数
1 |
$stateProvider |
parent
有两种方式可以指定父子状态关系。
一种是,使用点标记法,像本文最后嵌套视图部分举得栗子那样:
1 |
.state("tabs.tab1", {})
|
另一种是,使用 parent 属性
1 |
.state("tab1", {
|
abstract
使用 abstract 可以为所有的子状态提供一个基 URL,这样做的好处就是可以在抽象出来的这个状态所对应的 html 页面中来定义静态资源。抽象模板不能被激活。
1 |
$stateProvider |
resolve
resolve 在 state 配置参数中,是一个对象(key-value),每一个 value 都是一个可以依赖注入的函数,并且返回的是一个 promise (当然也可以是值)。
1 |
resolve: {
|
这样做的目的:
- 简化了
controller的操作,将数据的获取放在resolve中进行,这在多个视图多个controller需要相同数据时,有一定的作用。 - 只有当
reslove中的promise全部resolved(即数据获取成功)后,才会触发$stateChangeSuccess切换路由,进而实例化controller,然后更新模板。
更多参数可参考 angular 系列八 ui-router详细介绍及ngRoute工具区别 中 state 参数的讲解。
路由控制
url 动态部分被称为参数,有以下几种方式设置
1) 使用花括号的方式可以设置一个正则表达式规则的参数:
1 |
//只会匹配 pageId 为1到8位的数字 |
可以通过 ? 来指定参数作为查询参数
1 |
//比如匹配 href="/page?type='new'" |
如果需要不止一个查询参数,用 & 分隔:
1 |
//比如匹配 ui-sref="page({type:'all', title:'test ui-router'})"
|
路由的查找匹配
angular在刚开始的$digest时,$rootScope会触发$locationChangeSuccess事件(angular在每次浏览器hashchange 的时候也会触发$locationChangeSuccess事件)ui.router监听了$locationChangeSuccess事件,于是开始通过遍历一系列rules,进行路由查找匹配列表项- 当匹配到路由后,就通过
$state.transitionTo(state,...),跳转激活对应的state - 最后,完成数据请求和模板的渲染
在视图中,建议使用 ui-sref="xxxState" 而不是 href="#/abc",这样做能减少一遍 rules循环的遍历,提升性能。
两者区别
ngRoute模块 是 Angular 自带的路由模块,而 ui.router模块 是基于 ngRoute模块 开发的第三方模块。
ui.router 是基于 state(状态)的, ngRoute 是基于 url 的,ui.router模块 具有更强大的功能,主要体现在视图的嵌套方面。
嵌套视图
页面某个动态变化区块中,嵌套着另一个可以动态变化的区块。
前面的栗子就是一个很好的业务场景。
在首页中包含一个动态区块:
1 |
<body ng-app="ngRouteApp"> |
在标签页中又包含动态区块:
1 |
<div> |
一运行,报了一个这样的错误:
RangeError: Maximum call stack size exceeded
发现浏览器崩溃了,因为 ng-view 会陷入死循环,无限递归下去。
使用 ui.router 能很容易解决这个问题,因为它定义的路由有明确的父子关系,并通过 ui-view 指令将子路由模版插入到父路由模板的 <div ui-view></div> 中去,从而实现视图嵌套。看代码:
1 |
$stateProvider |
其他区别
ui-router(左) : ngRoute(右)
- 应用程序内的一个区域 : 应用程序中的 url
- 可以嵌套的层次结构 : 只是平面层次结构
- 名称可以自定义 : 名称只能是 url
- 通过名称或 url 导航 : 只能通过 url 导航
- 可以存在多个视图(ui-view) : 只能单一视图(ng-view)
- 可以填充任何视图 : 只能填充一个视图
- 通过状态填充某一部件 : 通过指令将填充某一部件
参考
ngRoute 和 ui.router 的使用方法和区别的更多相关文章
- ngRoute 与ui.router区别
angular路由 路由 (route) ,几乎所有的 MVC(VM) 框架都应该具有的特性,因为它是前端构建单页面应用 (SPA) 必不可少的组成部分. 那么,对于 angular 而言,它自然也有 ...
- angularjs ngRoute和ui.router对比
ngRoute模块是angularjs自带的路由模块,ui.router是一个第三方路由模块,接下来将对两者进行一个对比: ng-router(angular-router.js) ng-view n ...
- 【原创】ui.router源码解析
Angular系列文章之angular路由 路由(route),几乎所有的MVC(VM)框架都应该具有的特性,因为它是前端构建单页面应用(SPA)必不可少的组成部分. 那么,对于angular而言,它 ...
- AngularJS 使用 UI Router 实现表单向导
Today we will be using AngularJS and the great UI Router and the Angular ngAnimate module to create ...
- [转]AngularJS 使用 UI Router 实现表单向导
本文转自:http://www.oschina.net/translate/angularjs-multi-step-form-using-ui-router 今天我们将使用AngularJs和伟大的 ...
- QT visual stuido 集成插件不能打开ui文件的解决方法(去掉xml的UTF8标记)
QT visual stuido 集成插件不能打开ui文件的解决方法 visual studio里不能打开这个ui文件,出现warning等解决方法是:于是将<?xml version=&quo ...
- WPF多线程UI更新——两种方法
WPF多线程UI更新——两种方法 前言 在WPF中,在使用多线程在后台进行计算限制的异步操作的时候,如果在后台线程中对UI进行了修改,则会出现一个错误:(调用线程无法访问此对象,因为另一个线程拥有该对 ...
- WPF / Win Form:多线程去修改或访问UI线程数据的方法( winform 跨线程访问UI控件 )
WPF:谈谈各种多线程去修改或访问UI线程数据的方法http://www.cnblogs.com/mgen/archive/2012/03/10/2389509.html 子线程非法访问UI线程的数据 ...
- 转:探讨android更新UI的几种方法
本文转自:http://www.cnblogs.com/wenjiang/p/3180324.html 作为IT新手,总以为只要有时间,有精力,什么东西都能做出来.这种念头我也有过,但很快就熄灭了,因 ...
随机推荐
- jdbc preparestatement和preparestatement区别
1.preparestatement预编译,预编译指的是DB的编译器,会对此sql语句提前编译.然后将预编译的结果缓存到数据库中,下次执行时替换参数直接执行编译过的语句. 记住:数据库也是有编译器的, ...
- POJ 1470 Closest Common Ancestors LCA题解
本题也是找LCA的题目,只是要求多次查询.一般的暴力查询就必定超时了,故此必须使用更高级的方法,这里使用Tarjan算法. 本题处理Tarjan算法,似乎输入处理也挺麻烦的. 注意: 由于查询的数据会 ...
- axure 6.5 汉化正式版软件及注册码
Axure公司发布了Axure RP 6.5 正式版. 官方主页: http://www.axure.com/news 官方下载: http://www.axure.com/download 视频介绍 ...
- Informatica 常用组件Source Qualifier之一 概述
转换类型:主动.已连接 1 Source Qualifier 概述 当你添加关系表或平面文件源定义至映射时,需要将它连接至 Source Qualifier 组件.Source Qualifier ...
- DICOMDIR结构
DICOMDIR文件结构: 格式: DICOMDIR文件遵照DICOM文件的存储格式,需要有128个无意义字节的前言(假如没有特殊要求,这些字节都为00H),紧接着是DICOM前缀(长度为4字节的“D ...
- git 使用详解-- tag打标签
Git 的标签管理.跟大多数的 VCS 工具一样,git 也有在历史状态的关键点“贴标签”的功能,一般人们用这个功能来标记发布点(例如’v1.0′). 列出git中现有标签 要想列出git中现有的所有 ...
- java 中 SVN 设置所有文件及子目录 needs-lock, svn 提交时自动设置 needs-lock, 及版本不一致问题
摘自: http://my.oschina.net/zhangzhihao/blog/72177 设置后的效果:文件会自动带上svn:needs-lock属性,默认是只读的要签出才能修改以防止修改完后 ...
- 关于在Visual Studio 2008/2010 和Opencv平台下出现LINK : fatal error
http://blog.sina.com.cn/s/blog_9015f3230101bbef.html 关于在Visual Studio 2008/2010 和Opencv平台下出现LINK : f ...
- 区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理【转】
基于HTML5的PACS--图像伪彩 摘要: 要查看此系统更多的图像处理功能请参考:区域医疗移动医疗影像解决方案--基于HTML5的PACS--HTML5图像处理套用句广告语:哪里不会点哪里,so e ...
- 算法笔记_146:TarJan算法的应用(Java)
目录 1 问题描述 2 解决方案 1 问题描述 Problem Description 为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M& ...