angular-ui-router

ui-router和同属性的AngularJS框架一部分的ng-route一样强大。ui-router提供了让我们可以做路由嵌套和视图命名的特征。

实战

一般针对需求,我们可以使用AngularJS框架来创建简单的html和JavaScript页面。下面我们将创建3个HTML页面和一个JavaScript脚本文件
   一开始我们创建一个空的web应用程序,并加入三个HTML页面。如下所示,这些页面都是片段视图。它们会在导航过程中展示。我们还要为能展示应用程序的Tab,创建另外一个叫做PageTab.html的页面
  因此我们先创建以下文件:
1,Page1.html
2,Page2.html
3,Page3.html
4,PageTab.html

Page1.html

创建如下的html页面:

<div>
  <div>
    <h>我踏遍轮回,只为与你相遇</h1>
  </div>
</div>

Page2.html

创建如下的html页面:

<div>
  <div>
    <h>我要这天再也遮不住我的眼</h1>
  </div>
</div>

Page3.html

创建如下的html页面:

<div>
  <div>
    <h>要这地再也埋不住我的身</h1>
  </div>
</div>

PageTab.html

创建如下的html页面:

<div>
  <div>
    <span style="width:100px"><a href="">Page-1</a></span>
    <span style="width:100px"><a href="">Page-2</a></span>
    <span style="width:100px"><a href="">Page-3</a></span>
  </div>
</div>

这将会使页面文本处在侧边,并添加当用户鼠标悬停在文本上的时候的超链接。
  我们没有指向任何超链接,只是为了把链接放在href中,实际上这是一种获取url的解决方式
  到目前为止,我们还没有插入任何AngularJS路由或者其它任何框架。目前我们只是创建了一些页面片段,我们需要一个占位或者说父页面来装下这些东西,我们可以将这个页面起名为Main.html

Main.html

用如下内容创建这个html页面

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title></title>
  <script src="Scripts/angular.js"></script>
  <script src="Scripts/angular-ui-router.js"></script>
  <script src="App.js"></script>
</head>
<body data-ng-app="myApp">
  <h>AngularJS Home Page (Ui-router Demostration)</h1>
  <div data-ui-view=""></div>
</body>
<html>

我们需要在主页上做一些事情,(1)我们需要引入AngularJS框架(2)需要引入ui-router框架(3)引入AngularJS文件App.js(4)让主页内容展示出来,然后显示出它里面的页面
  而App.js文件的内容,我们声明了AngularJS模块和路由配置。当页面加载的时候我们会在Main.html中显示PageTab.html的内容。代码如下

App.js

var myApp=angular.module("myApp",['ui.router']);
myApp.config(function($stateProvider,$urlRouterProvider){
  $urlRouterProvider.when("","/PageTab");
  $stateProvide

.state("PageTab",{
      url:"/PageTab",
      templateUrl:"PageTab.html"
    })
    .state("PageTab.Page1",{
      url:"/Page1",
      templateUrl:"Page-1.html"
    })
    .state("PageTab.Page2",{
      url:"/Page2",
      templateUrl:"Page-2.html"
    })
    .state("PageTab.Page3",{
      url:"/Page3",
      templateUrl:"Page-3.html"
    });
});

现在来解释这些步骤都是干啥的

代码行

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

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

这里叫做App模块,这将告诉HTML页面这是一个AgularJS作用的页面,它的内容有AngularJS引擎来解释
2,这一行声明了把$stateProvider和$urlRouterProvider路由引擎作为函数参数传入,这样我们就可易为这个应用程序配置路由了

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

3,下面一行的意思是:如果没有路由引擎能匹配当前的导航状态,那它就会默认将路径路由至PageTab.html,这个页面就是状态名称被声明的地方。只要理解了这个,那么它就像switch case语句中的default选项

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

语句块

1,这一行定义了会在Main.html页面第一个显示出来的状态,作为页面被加载好以后第一个被使用的路由

$stateProvide
    .state("PageTab",{
      url:"/PageTab",
      templateUrl:"PageTab.html"
    })

这就是向母版页的子页面,应用程序会首先加载这个main.html页面
2,现在,就由这一行来定义页面,但是,这里又有点不同,我们之前为上面的状态名称加上了前缀,并且使用点"."号进行了分隔,这里很关键,它会告诉路由引擎我们在这里定义的是子页面/嵌入页面/嵌入状态的page/route.

.state("PageTab.Page2",{
      url:"/Page2",
      templateUrl:"Page-2.html"
    })

它将会在"PageTab.html"页面显示出来,它的意思是:当我们想要在母版页中管理所有的页面时,我们就会想要一个叫做"ui-view"的占位标记。因此我们现在把PageTab.html佳作一个母版页,因为它会把我们需要在PageTab.html中用"ui-view"声明好的其它页面都管理起来。现在我们再来修改这段代码

PageTab.html

<div>
  <div>
    <span style="width:100px"><a href="">Page-1</a></span>
    <span style="width:100px"><a href="">Page-2</a></span>
    <span style="width:100px"><a href="">Page-3</a></span>
  </div>
  <div>
    <div ui-view="" />
  </div>
</div>

下面一行:

<div>
<div ui-view="">
</div>

也就是说PageTab.html将对装下所有的子页面
现在一切就绪,但是页面应该显示哪个页面呢。这就是我们要在路由引擎里面配置的东西,如下所示

.state("PageTab.Page2",{
      url:"/Page2",
      templateUrl:"Page-2.html"
    })

Page2.html将会在被叫做PageTab的状态中显示,它就是PageTab.html
  但是我们还落下啥事没做,这事就是当我们在 Page-1 或者 Page-2 再或者 Page-3 菜单上点击的时候需要页面在占位标记那里显示出来,是不 ?
  还真是把那一块给忘啦,我们还没有为路由和这种逻辑建立起联系, 想象一下如果那是href的话,就意味着我们可以指定将会锚向页面里面的ID名称, 如果它是简单的html本地引用就是这样,但我们则需要按照需求显示不同的页面.
关键的地方在这里. (ui-sref) 我们需要再一次修改 PageTab.html,如下所示.,

<div>
  <div>
    <span style="width:100px" ui-sref=".Page1"><a href="">Page-1</a></span>
    <span style="width:100px" ui-sref=".Page2"><a href="">Page-2</a></span>
    <span style="width:100px" ui-sref=".Page3"><a href="">Page-3</a></span>
  </div>
  <div>
    <div ui-view="" />
  </div>
</div>

注意,只是上面高亮的部分发生了改变 , 这里我们只是简单的将App.js中定义的状态同tab中定义的对应文本进行了关联. 当我们使用点符号对它进行了声明,程序就会认为页面时ui-view中的子页面或者说嵌入页面,它们就是路由配置中需要被展示的页面.

AngularJS ui-router-组件:

$state/$stateProvider:管理状态定义,当前状态和状态的转换。包含触发状态转换的事件和回调函数,异步解决目标状态的任何依赖项,更新$location到当前状态。由于状态包含关联的url,通过$urlRouterProvider生成一个路由规则来执行转换的状态。
ui-view指示器:渲染状态中定义的视图,是状态中定义的视图的一个占位符。
$urlRouter/$urlRouterProvider:管理了一套路由规则列表来处理当$location发生变化时,如何跳转。最低级的方式是,规则可以是任意函数,来检查$location,并在处理完成时返回true。支持正则表达式规则和通过$urlMatcherFactory编译的UrlMatcher对象的url占位符规则。
$urlMatcherFactory:将url和占位符编译为UrlMatcher对象。除了$routeProvider支持的占位符语法之外,它还支持扩展语言,允许一个正则表达式指定占位符,并且能够提取命名参数和查询url的一部分。$templateFactory-通过$http/$templateCache来加载模块,供状态配置中使用

关于嵌套路由

所谓嵌套路由,就是视图里还可以再嵌套视图,路由里还可以在嵌套路由,并且通过ui-router,可以实现不同视图之间的参数传递

关于ui-router的简单使用

ui-router定义路由的时候,与ngRouter不一样,它是使用.来进行定义的,并且在html标签中,不使用ng-view,而是使用ui-view,比如:<div ui-view></div>
ui-router提供了$stateProvider,$urlRouterProvider来定义路由,具体使用如下:

/* 使用ui-router来进行路由定义,需要注入ui.router模块 */
var myApp = angular.module('myApp', ['ui.router']);

/* 注入$stateProvider,$urlRouterProvider */
myApp.config(['$stateProvider', '$urlRouterProvider', function ( $stateProvider, $urlRouterProvider ) {

/* 使用when来对一些不合法的路由进行重定向 */
$urlRouterProvider.when('', '/main');

/* 通过$stateProvider的state()函数来进行路由定义 */
$stateProvider.state('main', {
    url: '/main',
    templateUrl: 'views/main.html',
    controller: 'MainCtrl'
}).state('detail', {
    url: '/main/detail/store',
    templateUrl: 'views/detail.html',
    controller: 'DetailCtrl'
})

$stateProvider.state('404', {
    url: '/404',
    templateUrl: '404.html'
})

}]);

ui-router-路由控制$stateProvider

在我们的应用中大多数状态都有与其相关联的url,路由控制不是设计完成state之后的事后想法,而是在开始开发时就应该考虑的问题
如何设置一个基本的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。
状态被激活时,它的模板会自动插入到父状态对应的模块中包含ui-view属性的元素内部。如果是顶层的状态,那么它的父模板就是index.html

激活状态

有三种方法来激活状态:
1调用$state.go()方法,这是一个高级的遍历方法
2点击包含ui-sref指令链接
3导航到与状态相关连的url

Templates模块

可以通过下面几种方式来配置一个状态的模块

方法一

配置template属性,指定一段HTML字符串,这是设置模块的最简单打方式

$stateProvider.state('contact',{
template:'<h1>my contacts<h1>'
})

方法二

配置templateUrl属性,来加载到指定位置的模块,这就是设置模块的常用方法

$stateProvider.state('contacts',{
templateUrl:'contacts.html'
})

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

推荐阅读更多精彩内容