ngRouter和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
在每次浏览器hash
change 的时候也会触发$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)
- 可以填充任何视图 : 只能填充一个视图
- 通过状态填充某一部件 : 通过指令将填充某一部件
参考:
ngRouter和ui-router区别的更多相关文章
- ngRoute 与ui.router区别
angular路由 路由 (route) ,几乎所有的 MVC(VM) 框架都应该具有的特性,因为它是前端构建单页面应用 (SPA) 必不可少的组成部分. 那么,对于 angular 而言,它自然也有 ...
- ngRoute 和 ui.router 的使用方法和区别
在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比 ...
- 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而言,它 ...
- angular : $location & $state(UI router)的关系
次序:angular 的 location会先跑 $rootScope.$on("$locationChangeStart", function (scope, newUrl, o ...
- angular ui.router 路由传参数
angular已经用了一段时间了,最近在做路由,做一下笔记. 路由跳转的时候进行穿参 ui.router方式 <a ui-sref="edit({id:5})"> 编辑 ...
- 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和伟大的 ...
- [转]AngularJS+UI Router(1) 多步表单
本文转自:https://www.zybuluo.com/dreamapplehappy/note/54448 多步表单的实现 在线demo演示地址https://rawgit.com/dream ...
- angularJS ui router 多视图单独刷新问题
场景:视图层级如下 view1 --view11 --view111 需求:view11的一个动作过后,单独刷新view12 解决方式:修改层级设计 view1 --view11 --view111 ...
随机推荐
- Android Studio 1.1.0汉化初步出炉!
我找到去年12月国人汉化的版本,然后迁移上来的.实测支持Android window最新版(1.1.0) 项目分4部分:1压缩好的:2文本分析器:3原生的语言包:4原版语言包备份 现在一些新增的项目没 ...
- python中GIL和线程与进程
线程与全局解释器锁(GIL) 一.线程概论 1.何为线程 每个进程有一个地址空间,而且默认就有一个控制线程.如果把一个进程比喻为一个车间的工作过程那么线程就是车间里的一个一个流水线. 进程只是用来把资 ...
- 记一次简单爬虫(豆瓣/dytt)
磕磕绊绊学python一个月,这次到正则表达式终于能写点有趣的东西,在此作个记录: ————————————————————————————————————————————————— 1.爬取豆瓣电影 ...
- Yii 日期时间过滤列 filter
在yii使用过程中,我们经常要使用到 按时间区间来检索数据 用gridview自身的filter就无法满足我们得需求. 下面可以用插件的方式来搞定: sydatecolumn 下载地址:http:// ...
- AGC009:Eternal Average
传送门 好神啊 直接考虑一棵 \(n+m\) 个叶子的 \(k\) 叉树,根结点权值为 \(\sum_{i\in m}(\frac{1}{k})^{deep_i}\) 对于一个 \(deep\) 的序 ...
- 慕课网 javascript深入浅出编程练习
任务 请在index.html文件中,编写arraysSimilar函数,实现判断传入的两个数组是否相似.具体需求: 1. 数组中的成员类型相同,顺序可以不同.例如[1, true] 与 [false ...
- 自定义RatingBar评分控件
1.介绍 实现类似美团外卖评分供能,系统提供了RatingBar,今天来自定义一波,当做自定义view的一个学习,效果如下,能够滑动或者点击变化星星数量 2.自定义属性 在values目录下的attr ...
- java基础(九) 可变参数列表介绍
一.可变参数简介 在不确定参数的个数时,可以使用可变的参数列表. 1. 语法: 参数类型...(三个点) 例如: void printArray(Object...) 注意: 每个方法最多只有一个可变 ...
- requirejs中Shims使用说明
RequireJS中如果使用AMD规范,在使用的过程中没有太多的问题,如果加载非AMD规范的JS文件,就需要使用Require中的shim. require.config({ paths:{ jque ...
- 6.Spring MVC SSM整合问题总结
1.Cannot find class [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter] for ...