【修真院web小课堂】如何使用UI-ROUTER?

       大家好,我是IT修真院北京分院第23期的学员郭婷婷,一枚正直纯洁善良的WEB前端程序员。

       今天给大家分享一下,如何使用UI-ROUTER?

       分享人:郭婷婷

1.背景介绍

                    Angular.js有内置的路由模块:叫做ngRoute。但是事实却是许多开发者却不使用其内置的路由模块,而是使用一个基于ngRoute开发的第三方路由模块

                    (UI-Router模块)来代替。

2.知识剖析

                  var myApp = angular.module("myApp", [ui.router]);

                  myApp.config(function ($stateProvider, $urlRouterProvider) {

                  $urlRouterProvider.when("", "/PageTab");

第一行,声明AngularJS模块, 并把ui-router传入AngularJS主模块,所有的结合起来我们就得到了Angular模块。

                第二行声明了把 $stateProvider 和 $urlRouteProvider 路由引擎作为函数参数传入,这样我们就可以为这个应用程序配置路由了.

                第三行,如果没有路由引擎能匹配当前的导航状态,那它就会默认将路径路由至 PageTab.html, 这个页面就是状态名称被声明的地方。

                    .state("PageTab", {

                        url: "/PageTab",

                        templateUrl: "PageTab.html"

                      })

                    .state("Page", {

                        url: "/Page",

                        template: 'hello world'

                      })

template, 字符串方式的模板内容,或者是一个返回 HTML 的函数

templateUrl, 模板的路径,或者返回模板路径的函数

url选项将会为该应用的状态指定一个URL基于用户浏览该应用所在的状态。

$state /

                    $stateProvider:管理状态定义、当前状态和状态转换。包含触发状态转换的事件和回调函数,异步解决目标状态的任何依赖项,更新$location到当前状态。由于状态包含关联的

url,通过$urlRouterProvider生成一个路由规则来执行转换的状态。

$urlRouter /

                    $urlRouterProvider:管理了一套路由规则列表来处理当$location发生变化时如何跳转。最低级的方式是,规则可以是任意函数,来检查$location,并在处理完成时候返回true。支持正则表达式规则和通过$urlMatcherFactory编译的UrlMatcher对象的

url 占位符规则。

ui-view指示器:渲染状态中定义的视图,是状态中定义的视图的一个占位符。

Views 视图

                    开发者可以在同一个模板中改变和切换不同的视图。如果设置了视图选项,则该状态的‘template’,‘templateUrl’及‘templateProvider’将被忽略。如果想在路由里包含父级模板,就需要创建一个包含模板的抽象模板。例如:

                     state('PageTab.uitest', {

                          url: '/',

                          views: {

                                '': {

                                      template: 'hello world'

                                },

                                'status': {

                                          template: 'home page'

                                }

                                }

                          });

when()

该函数需要两个参数:1.当前的路径,2.需要重定向到的路径(或者是需要在路径被访问是运行的函数)。设置重定向前需要为$urlRouterProvider设置when函数来接受一个字符串。例如,当希望重定向一个空的路由到/inbox:

                $urlRouterProvider.when("","/pagedata");

otherwise()

和ngRoute的otherwise()函数相似,在用户提交的路径没有被定义的时候它将重定向到指定的页面。这是个创建’默认‘路径的好方法。

otherwise()只接受一个参数,要么函数要么字符串,字符串必须为合法的url路由地址,函数则会在没有任何路径被匹配的时候被运行。

                .config(function($urlRouterProvider) {

                  $urlRouterProvider.otherwise('/');

                  // or

                  $urlRouterProvider.otherwise(

                    function($injector, $location) {

                      $location.path('/');

                    });

                });

3.常见问题

为什么大家更喜欢使用ui-router替代angular内置的ngroute

        这是因为UI-Router有两个重要的特性:

* 多视图

* 嵌套视图

4.解决方案

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

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

                      $routeProvider

                        .when("/ngtest", {

                      template: 'hello world'

                        })

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

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

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

                      state('PageTab.uitest', {

                          url: '/',

                          views: {

                                '': {

                                      template: 'hello world'

                                },

                                'status': {

                                          template: 'home page'

                                }

                                }

                          });

                    两个区块,分别显示了不同的内容,原因在于,在ui.router中:

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

2、可以在路由配置中根据视图名字(如:status),配置不同的模板。

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

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

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

                          I am parent

                         I am child

                    转成javascript,我们会在程序里这样写:

                        $routeProvider

                            .when('/', {

template: 'I am parentI am child'

                        });

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

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

                        $stateProvider

                            .state('parent', {

                                    abstract: true,

                                    url: '/',

template: 'I am parent'

                                  })

                            .state('parent.child', {

                                    url: '',

                                    template: 'I am child'

                                  });

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

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

5.编码实战

6.扩展思考

state.go传参

state.go跳转页面

                      angular.module("myApp").controller("pagectrl",function ($scope,$state) {

                        $scope.test = function () {

                            $state.go('PageTab.Page1')

                            }

                      })

state.go传参

                    //路由配置页面

                    .state("PageTab.Page1", {

                      url:"/Page1:id",

                      templateUrl: "Page1.html"

                      })

                    //跳转页面

                    angular.module("myApp").controller("pagectrl",function ($scope,$state) {

                        $scope.test = function () {

                            $state.go('PageTab.Page1',{"id":"test"})

                            }

                      })

                    //跳转目标页

                    angular.module("myApp").controller("page1ctrl",function ($scope,$stateParams) {

                        console.log($stateParams.id)

                          })

7.参考文献

AngularJS ui-router (嵌套路由)

ui.router源码解析

8.更多讨论


1、ui-sref 和 $state.go 的区别

ui-sref 一般使用在 <a> 标签上;而$state.go一般使用在 controller 里面。

2、$stateParams怎样获取参数?

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

3、UI-ROUTER如何设置?

这里是如何设置一个基本url。

$stateProvider

.state('contacts', {

url:"/contacts",

templateUrl:'contacts.html'

    })

当我们访问index.html/contacts时,'contacts'状态将被激活,同时index.html中的ui-view将被'contacts.html'填充。或者,通过transitionTo('contacts')方法将状态转变到'contacts'状态,同时 url 将更新为index.html/contacts。

鸣谢

感谢大家观看

BY :郭婷婷

PPT链接:https://ptteng.github.io/PPT/PPT/js-06-ui-router-pek.html#/

视频链接:https://v.qq.com/x/page/o0527550hgl.html

--------------------------------------------------------------------------------------------------------------------

技能树.IT修真院

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

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

猛戳这里

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

推荐阅读更多精彩内容