如何使用UI-ROUTER?

大家好,我是IT修真院上海分院第01期学员,一枚正直善良的web程序员。

今天给大家分享一下,修真院官网 CSS任务中可能会使用到的知识点:

浏览器如何渲染页面

一、背景介绍

angular路由

路由(route),几乎所有的MVC(VM)框架都应该具有的特性,因为它是前端构建单页面应用(SPA)必不可少的组成部分。

那么,对于angular而言,它自然也有内置的路由模块:叫做ngRoute。

不过,大家很少用它,因为它的功能太有限,往往不能满足开发需求!!

于是,一个基于ngRoute开发的第三方路由模块,叫做ui.router,受到了大家的“追捧”。 ngRoute vs ui.router

首先,无论是使用哪种路由,作为框架额外的附加功能,它们都将以模块依赖的形式被引入,简而言之就是:在引入路由源文件之后,你的代码应该这样写(以ui.router为例):

angular.module("myApp", ["ui.router"]);//myApp为自定义模块,依赖第三方路由模块ui.router

这样做的目的是:在程序启动(Angular)的时候,加载依赖模块(如:ui.router),将所有挂载在该模块的服务(provider),指令(directive),过滤器(filter)等都进行注册,那么在后面的程序中便可以调用了。

说到这里,就得看看ngRoute模块和ui.router模块各自都提供了哪些服务,哪些指令?

首先,无论是使用哪种路由,作为框架额外的附加功能,它们都将以模块依赖的形式被引入,简而言之就是:在引入路由源文件之后,你的代码应该这样写(以ui.router为例):

angular.module("myApp", ["ui.router"]);//myApp为自定义模块,依赖第三方路由模块ui.router

这样做的目的是:在程序启动(Angular)的时候,加载依赖模块(如:ui.router),将所有挂载在该模块的服务(provider),指令(directive),过滤器(filter)等都进行注册,那么在后面的程序中便可以调用了。

说到这里,就得看看ngRoute模块和ui.router模块各自都提供了哪些服务,哪些指令?

ngRoute

$routeProvider(服务提供者) ——— 对应于下面的urlRouterProvider和stateProvider

$route(服务) ——— 对应于下面的urlRouter和state

$routeParams(服务) ——— 对应于下面的stateParams

ng-view(指令) ——— 对应于下面的ui-view

ui.router

$urlRouterProvider(服务提供者) ——— 用来配置路由重定向

$urlRouter(服务)

$stateProvider(服务提供者) ——— 用来配置路由

$state(服务) ——— 用来显示当前路由状态信息,以及一些路由方法(如:跳转)

$stateParams(服务) ——— 用来存储路由匹配时的参数

ui-view(指令) ——— 路由模板渲染,对应的dom相关联

ui-sref(指令)

(注:服务提供者:用来提供服务实例和配置服务。)

二、知识刨析

ngRoute

$routeProvider(服务提供者) ——— 对应于下面的urlRouterProvider和stateProvider

$route(服务) ——— 对应于下面的urlRouter和state

$routeParams(服务) ——— 对应于下面的stateParams

ng-view(指令) ——— 对应于下面的ui-view

ui.router

$urlRouterProvider(服务提供者) ——— 用来配置路由重定向

$urlRouter(服务)

$stateProvider(服务提供者) ——— 用来配置路由

$state(服务) ——— 用来显示当前路由状态信息,以及一些路由方法(如:跳转)

$stateParams(服务) ——— 用来存储路由匹配时的参数

ui-view(指令) ——— 路由模板渲染,对应的dom相关联

ui-sref(指令)

这样一看,其实ui.router和ngRoute大体的设计思路,对应的模块划分都是一致的(毕竟是同一个团队开发),不同的地方在于功能点的实现和增强。

那么问题来了:ngRoute弱在哪些方面,ui.router怎么弥补了这些方面?

这里,列举两个最重要的方面来说(其他细节,后面再说):

多视图

嵌套视图

三、常见问题

多视图

多视图:页面可以显示多个动态变化的不同区块。

这样的业务场景是有的:

比如:页面一个区块用来显示页面状态,另一个区块用来显示页面主内容,当路由切换时,页面状态跟着变化,对应的页面主内容也跟着变化。

首先,我们尝试着用ngRoute来做:


我们在html中利用ng-view指令定义了两个区块,于是两个div中显示了相同的内容,这很合乎情理,但却不是我们想要的,但是又不能为力,因为,在ngRoute中:

视图没有名字进行唯一标志,所以它们被同等的处理。

路由配置只有一个模板,无法配置多个。

ok,针对上述两个问题,我们尝试用ui.router来做:


这次,结果是我们想要的,两个区块,分别显示了不同的内容,原因在于,在ui.router中:

可以给视图命名,如:ui-view=”status”。

可以在路由配置中根据视图名字(如:status),配置不同的模板(其实还有controller等)。

嵌套视图

嵌套视图:页面某个动态变化区块中,嵌套着另一个可以动态变化的区块。

这样的业务场景也是有的:

比如:页面一个主区块显示主内容,主内容中的部分内容要求根据路由变化而变化,这时就需要另一个动态变化的区块嵌套在主区块中。

其实,嵌套视图,在html中的最终表现就像这样:


倘若,你真的用ngRoute这样写,你会发现浏览器崩溃了,因为在ng-view指令link的过程中,代码会无限递归下去。

那么造成这种现象的最根本原因:路由没有明确的父子层级关系!

看看ui.router是如何解决这一问题的?

巧妙地,通过parent与parent.child来确定路由的父子关系,从而解决无限递归问题。

另外子路由的模板最终也将被插入到父路由模板的div[ui-view]中去,从而达到视图嵌套的效果。

五、扩展思考

参数:

name:状态的名称。

stateConfig:状态配置对象。配置具有以下各项属性(全部属性,看一下好了):

template:string/function,html模板字符串,或者一个返回html模板字符串的函数。templateUrl:string/function,模板路径的字符串,或者返回模板路径字符串的函数。templateProvider:function,返回html模板字符串或模板路径的服务。controller:string/function,新注册一个控制器函数或者一个已注册的控制器的名称字符串。controllerProvider:function,返回控制器或者控制器名称的服务controllerAs:string,控制器别名。

parent:string/object,手动指定该状态的父级。resolve:object,将会被注入controller去执行的函数,string,function>形式。url:string,当前状态的对应url。

views:object,视图展示的配置。string,object>形式。

abstract:boolean,一个永远不会被激活的抽象的状态,但可以给其子级提供特性的继承。默认是true。

onEnter:function,当进入一个状态后的回调函数。onExit:function,当退出一个状态后的回调函数。reloadOnSearch:boolean,如果为false,那么当一个search/query参数改变时不会触发相同的状态,用于当你修改$location.search()的时候不想重新加载页面。默认为true。

data:object,任意对象数据,用于自定义配置。继承父级状态的data属性。换句话说,通过原型继承可以达到添加一个data数据从而整个树结构都能获取到。params:url里的参数值,通过它可以实现页面间的参数传递。

六、参考文献

参考1:angular的uiRouter服务学习

参考2:$stateParams服务

七、更多讨论

1、abstract属性有什么用?

不能被直接激活,这样无效 就会触发 $urlRouterProvider.otherwise("app/start");

2、ui-router参数传递问题,三种写法

首先,要在目标页面定义接受的参数:

传参



接收参数,在目标页面的controller里注入$stateParams,然后 "$stateParams.参数名" 获取

3、点击ui-srefurl跳转,页面未加载问题

home.html里面没写ui-view,登录跳转的是first.second是first的子路由,渲染模版的时候会自动寻找父级模版內的ui-view,如果没提供自然就看不到。

八、视频链接

PPT:


undefined_腾讯视频

视频:

undefined_腾讯视频

技能树.IT修真院

“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。

这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧 !

鸣谢 熊凡师兄!

感谢大家的阅读!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 【JS-6】 如何使用ui-router? 小课堂【武汉分院第137期】 分享人:徐恒 目录 1.背景介绍 2.知...
    爱上Shu的小刺猬阅读 1,971评论 2 5
  • 1.背景介绍 UI-Router它是一个让开发者能够根据URL状态或者说是'机器状态'来组织和控制界面UI的渲染,...
    我叫于搞吧阅读 617评论 0 0
  • 大家好,我是IT修真院深圳分院第04期学员,一枚正直善良的web程序员。 今天给大家分享一下,修真院官网 js任务...
    仿佛锋阅读 1,762评论 0 0
  • 大家好,我是IT修真院武汉分院第10期学员余佳贝,一枚正直善良的web程序员。 今天给大家分享一下,修真院官网js...
    寡人yu阅读 360评论 0 0
  • hey,你假装在我身边有一年了。 不知道对于你来说,这一年过得开心吗,其实还是会有人叫错你。 去年年初我们一起在烤...
    雪琪呀阅读 219评论 0 0