路由ui-router

2023-11-07

路由ui-router

Angular ngRoute针对于单视图,而ui-router可用于多视图(这里说的视图是指在页面内我们可控制的,可变化的区域)。比如我们点击了一个link,我们需要在视图中跳转到指定的一个页面,那么ngRoute已经满足了我们的需求,而当我们点击的时候,需要分别在不同的地方跳转两个不同的页面的时候,ngRoute就不够用了,我们就需要用到ui-router。

在ui-router中,有3个关键词:状态(state)、Url、模板(template),也就是说,它在ng-route的基础之上,增加了“状态”的概念。这三者是一对一的关系:每一个模板,存在于一个特定的Url,同时也对应于一个独一无二的状态。

所以,我们想要在代码中控制页面跳转的时候,既可以基于url,用href的方式进行跳转,也可以进行状态的转换,两者都可以达到切换template的目的。

$urlRouterProvider

urlRouterProvider u r l R o u t e r P r o v i d e r 负 责 监 听 location.当 location l o c a t i o n 变 化 的 时 候 , urlRouterProvider开始在一个规则的列表中一个个的查找,直到找到匹配的值。$urlRouterProvider用于在后端指定url的状态配置。所有的url被编译成UrlMatcher对象。

otherwise(rule);

定义一个当请求的路径是无效路径时跳转的路径。
rule:你想重定向的url路径或一个返回的网址路径的规则函数。函数传入两个参数: injector i n j e c t o r 和 location服务,而且必须返回一个string的url。
代码:

angular.module('Demo',['ui.router'])
.config(["$urlRouterProvider",function(){
$urlRouterProvider.otherwise(rule); // rule = 重定向的url规则
}])

$state

$state服务负责代表状态及提供状态之间的转换。它还提供你当前的状态及上一个状态。

方法

get(stateOrName,context);
返回任何指定的状态或所有状态的配置对象。
参数:
stateOrName:如果提供此参数,返回的是指定状态的配置对象;如果不提供此参数,则返回全部状态的配置对象。
context:当context是一个相对的参考状态,状态会在相关上下文中检索。

go(to,params,options);
参数:
to:string,即将跳转的状态。
params:object,跳转所带的参数。
options:object,可选配置对象。有 location(是否更新地址栏的url,或以什么字符串替换url),inherit(是否继承当前url的参数),relative(当变化相对路径:如”^,定义的状态是相对的),notify(是否广播 stateChangeStart s t a t e C h a n g e S t a r t 和 stateChangeSuccess事件),reload(是否重新载入)。
代码:
$state.go('contact.detail');

href(stateOeName,params,options);
一个URL生成方法,返回为给定的状态填充指定的参数编译后的链接。
参数:
stateOeName:string,你想要生成的url的状态或者状态对象。
params:object,一个用于填充状态需要的参数的对象。
options:可选配置对象。有lossy(当第一个参数url未被提供时是否继承导航的url进行构建href),inherit(是否继承当前url的参数),relative(当变化相对路径:如”^,定义的状态是相对的),absolute(是否生成绝对url)。
代码:
$state.href("about.person", { person: "bob" })

事件

$stateChangeError
路由状态变化发生错误时触发的事件。参数有:event,toState,toParams,fromState,fromParams,error。
$stateChangeStart
路由状态变化发生前触发的事件。参数有:event,toState,toParams,fromState,fromParams。
$stateChangeSuccess
路由状态变化正确时触发的事件。参数有:event,toState,toParams,fromState,fromParams。
$stateNotFound
路由状态没找到的时候触发的事件。参数有:event,unfoundState,fromState,fromParams。

$stateProvider

处理路由状态的服务,路由的状态反映了该项在应用程序中的位置,描述了在当前状态下UI是应该怎么样的,并且该做什么。

state(name,stateConfig);
注册一个状态,并给定其配置。
参数:
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里的参数值,通过它可以实现页面间的参数传递。

ui-sref

一种将链接(<a>标签)绑定到一个状态的指令。点击该链接将触发一个可以带有可选参数的状态转换。

<a ui-sref="app.index">首页</a>
<!-- 这里是正常的跳转 -->
<a ui-sref="app.index({id:yourId})">你的主页</a>
<!-- 这里是带参数对象的跳转,名称是id,值是yourId -->

使用示例

简单的使用代码(ui-router的单视图):

<div ng-app="Demo" ng-controller="testCtrl as ctrl">
<ol>
<li><a ui-sref="app">app</a></li>
<li><a ui-sref="test">test</a></li>
</ol>
<div ui-view></div>
<script type="text/ng-template" id="'page1.html'">
this is page 1 for app.
</script>
<script type="text/ng-template" id="'page3.html'">
this is page 1 for test.
</script>
</div>
angular.module('Demo', ['ui.router'])
.config(["$stateProvider","$urlRouterProvider",routeConfig])
.controller("testCtrl", angular.noop)
function routeConfig($stateProvider,$urlRouterProvider){
$urlRouterProvider.otherwise("/app");
$stateProvider
.state("app",{
url:"/app",
templateUrl:"'page1.html'"
})
.state("test",{
url:"/test",
templateUrl:"'page3.html'"
})
}

使用代码(ui-router的多视图):

<div ng-app="Demo" ng-controller="testCtrl as ctrl">
<ol>
<li><a ui-sref="app.page1">app</a></li>
<li><a ui-sref="test.page1({id:1})">test</a></li>
</ol>
<div ui-view></div>
<script type="text/ng-template" id="'layout.html'">
<div ui-view="nav@"></div>
<div ui-view></div>
</script>
<script type="text/ng-template" id="'nav1.html'">
<ol>
<li><a ui-sref="app.page1">app.page1</a></li>
<li><a ui-sref="app.page2">app.page2</a></li
</ol>
</script>
<script type="text/ng-template" id="'nav2.html'">
<ol>
<li><a ui-sref="test.page1({id:1})">test.page1</a></li>
<li><a ui-sref="test.page2">test.page2</a></li
</ol>
</script>
<script type="text/ng-template" id="'page1.html'">
this is page 1 for app.
</script>
<script type="text/ng-template" id="'page2.html'">
this is page 2 for app.
</script>
<script type="text/ng-template" id="'page3.html'">
this is page 1 for test.
</script>
<script type="text/ng-template" id="'page4.html'">
this is page 2 for test.
</script>
</div>
angular.module('Demo', ['ui.router'])
.config(["$stateProvider","$urlRouterProvider",routeConfig])
.controller("testCtrl", angular.noop)
function routeConfig($stateProvider,$urlRouterProvider){
$urlRouterProvider.otherwise("/app/page1");
$stateProvider
.state("app",{
url:"/app",
views:{
"":{
templateUrl:"'layout.html'"
},
"nav":{
templateUrl:"'nav1.html'"
}
}
})
.state("app.page1",{
url:"/page1",
templateUrl:"'page1.html'"
})
.state("app.page2",{
url:"/page2",
templateUrl:"'page2.html'"
})
.state("test",{
url:"/test",
views:{
"":{
templateUrl:"'layout.html'"
},
"nav":{
templateUrl:"'nav2.html'"
}
}
})
.state("test.page1",{
url:"/page1?:id",
templateUrl:"'page3.html'",
controller:["$stateParams",function($stateParams){
console.log($stateParams.id);// 1 这里实现传参
}],
params:{
id:null
}
})
.state("test.page2",{
url:"/page2",
templateUrl:"'page4.html'"
})
}

一般使用

假如我们现在有3个页面,模板分别为page1.html、page2.html、page3.html,同时我们分别给予一个状态:one、two、three。如果我们想要下图的跳转效果:

这里写图片描述

即1可以跳到2,2可以跳到3,3又可以跳回1。我们可以这么做:

(1)在templates文件夹下新建3个模板(为了举例,这里模板的内容很简单),其中设置一个可以跳转的按钮,按钮带有一个叫做“ui-sref”的属性,用来填入一个state:

page1.html

<ion-nav-view>
<ion-content>
<p>
This is page 1.
</p>
<!--因为要跳转到页面2,所以这里ui-sref填入页面2的状态:two-->
<a class="button" ui-sref="two">go to page2</a>
</ion-content>
</ion-nav-view>

同理,页面2和页面3:

page2.html

<ion-nav-view>
<ion-content>
<p>
This is page 2.
</p>
<a class="button" ui-sref="three">go to page3</a>
</ion-content>
</ion-nav-view>

page3.html

<ion-nav-view>
<ion-content>
<p>
This is page 3.
</p>
<a class="button" ui-sref="one">go to page1</a>
</ion-content>
</ion-nav-view>

(2)在app.js中配置路由:

在config过程中配置。我们需要使用到服务 stateProvider s t a t e P r o v i d e r , 它 用 来 设 置 状 态 路 由 。 另 外 , 还 有 一 个 urlRouterProvider,它通常用来设置打开App后默认跳转的Url,即启动页面。
上述例子的路由配置为:

...
.config(function ($stateProvider, $urlRouterProvider) {
// $stateProvider用来配置状态路由
$stateProvider
.state('one', { // "one"是页面1的状态
url: '/one', // "/one"是页面1的Url
templateUrl: 'templates/page1.html' // "page1.html"是页面1的模板
})
.state('two', {
url: '/two',
templateUrl: 'templates/page2.html'
})
.state('three', {
url: '/three',
templateUrl: 'templates/page3.html'
});
// 以上匹配都失败的情况下,进行下面的匹配
// 通常用在配置第一个进入的界面,比如这里定义了首先进入界面2
$urlRouterProvider.otherwise('/one');
});

ui-router路由在ion-tabs中的使用

如果应用存在ion-tab元素,那么路由的配置会复杂那么一点点。具体来说,还是我们上面的例子,假如这时候我需要把这3个页面分别对应于3个tab(即底部选项卡),那就需要考虑更多:
因为底部栏是3个页面中的公共部分,所以我们可以抽出来作为一个“父模板”(tabs.html),其状态为“tabs”,url为“#/tabs”
然后,原来的3个模板就作为它的子模板,对应的状态就得使用符号“.”连接上父状态,来设置成“tabs.one”、“tabs.two”、“tabs.three”。如此一来,对应的URL就变成了“#/tabs/one”、“#/tabs/two”、“#/tabs/three”。

(1)创建带有3个tab的模板tabs.html,它作为3个page的“父模板”,并且在每一个tab上使用ui-sref属性来建立点击的跳转:
tabs.html

<ion-tabs>
<!--ui-sref设置点击该tab跳到的对应的状态-->
<ion-tab title="1" ui-sref="tabs.one">
<!--name属性说明了装载某个模板的容器的名字,这个会在路由配置文件中体现出作用-->
<ion-nav-view name="for_template_page_1"></ion-nav-view>
</ion-tab>
<ion-tab title="2" ui-sref="tabs.two">
<ion-nav-view name="for_template_page_2"></ion-nav-view>
</ion-tab>
<ion-tab title="3" ui-sref="tabs.three">
<ion-nav-view name="for_template_page_3"></ion-nav-view>
</ion-tab>
</ion-tabs>

(2)修改app.js中的路由配置(解说在注释里):

...
$stateProvider
.state('tabs', { //父页面的状态
url: '/tabs', //父页面的Url
abstract: true, //true表示该页面作为一个父页面,父页面其实可以理解成3个子页面的共同部分,即底部的3个tab。配置之后,父页面不能单独存在。
templateUrl: 'templates/tabs.html'
})
.state('tabs.one', { //页面1的状态。注意这里不再是one,而是tabs.one,即子状态,这样的Url就会自动带上父页面的Url,即/tabs/one
url: '/one', //注意写法,这里不用带上父url,不要写成/tabs/one
views: {
'for_template_page_1': { //这里填入tab子页面的容器的名字,对应于tabs.html中<ion-nav-view>的name属性
templateUrl: 'templates/page1.html' //这里表示:在"for_template_page_1"这个tab中装载"templates/page1.html"这个模板
}
}
})
.state('tabs.two', { //其余的同上
url: '/two',
views: {
'for_template_page_2': {
templateUrl: 'templates/page2.html'
}
}
})
.state('tabs.three', {
url: '/three',
views: {
'for_template_page_3': {
templateUrl: 'templates/page3.html'
}
}
});

改写之后,路由属性嵌套得比较多,所以要写清楚。错了一个地方,通常会导致页面显示不出来。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

路由ui-router 的相关文章

随机推荐

  • 内网IP使用Https小记

    本文章记录使用Nginx 给内网IP地址提供Https协议功能 1 使用openssl生成自签证书 2 将证书配置在Nginx中 3 使用443端口 出现的一些问题 1 Chrome浏览器 会提示不安全 可以忽略 或者本地浏览器添加证书信任
  • cout保留两位小数

    cout保留两位小数 include
  • 简单方便的 JavaScript 逆向辅助模拟方法

    这是 进击的Coder 的第 419 篇技术分享 作者 崔庆才 来源 崔庆才丨静觅 阅读本文大概需要 3 分钟 在 JavaScript 逆向过程中 我们可能找到了一些入口 但是深入追踪下去 就发现这个过程过于复杂 调用层级越来越深 最终很
  • Obsidian 编译第三方插件

    起因 obsidian spaced repetition 是Obsidian 间隔重复插件 它可以帮助你定期复习自建的知识卡片 但功能上不是很全面 碰巧看到 Felix Luo 维护的obsidian spaced repetition插
  • 一分钟教你看懂蓝屏代码,轻松解决电脑蓝屏问题

    微软为了我们电脑中的资料安全可以说煞费苦心设计了很多有效的防护机制 其中蓝屏就是一个很好的给保护机制 接下来小编就提供一些经常出现的电脑蓝屏代码给大家 电脑蓝屏问题可以说只要使用过电脑朋友都遇到过 导致电脑蓝屏的原因有很多种 所有蓝屏代码也
  • 基于SM2密码算法的环签名方案的研究与设计

    摘要 环签名算法种类很多 大多数算法设计基于双线性对或大素数难分解 在安全性和运算速度方面有待提高 与基于椭圆曲线离散对数相比 双线性对的优势并不明显 因为它无法运用一样长度的密钥提供同样的安全性能 为了能够提升方案的安全性以及能够保证签名
  • JDK源码系列 & JAVA语言数据类型Byte

    目录 类的继承结构图 类的Diagram图 类 类的注释 源码分析 全局变量 静态内部类 构造方法 静态方法 parseByte 静态方法 valueOf 静态方法 toString 静态方法 hashCode 静态方法 decode 静态
  • 简述osi参考模型各层主要功能_OSI与TCP/IP简述

    OSI与TCP IP 二者区别 OSI参考模型定义计算机通信每层的功能 不是协议 TCP IP协议是具体的协议 实现了OSI参考模型规定的功能 参考下图 OSI参考模型每层功能 应用层 根据互联网中需要通信的应用程序的功能 定义客户端和服务
  • Android 显示提示框

    本文档为个人博客文档系统的备份版本 作者 小游 作者博客 点击访问 代码如下 Toast makeText context things happened Toast LENGTH SHORT show
  • go 命名与包;关于 ++/--;接收键盘输入/终端输入;switch;for 循环;函数;init 函数;匿名函数;闭包;defer;时间日期;内置函数;defer+recover 机制处理错误

    文章目录 命名与包 关于 接收键盘输入 终端输入 switch for 循环 函数 init 函数 匿名函数 闭包 defer 时间日期 内置函数 defer recover 机制处理错误 数组 代码 输出 命名与包 关于 接收键盘输入 终
  • drawio界面自定义配置

    1 适用的 drawio 版本 单机版 drawio 带有配置选项的单机版本 2 配置使用方法 点击配置 将json代码复制到弹窗中 点击应用即可 如果代码有错误 将无法应用 3 相关json代码 官方json配置参考 https www
  • Internet Download Manager2023最好用的HTTP下载神器

    Internet Download Manager 介绍2023最佳下载利器 Internet Download Manager 简称IDM 是一款Windows 平台功能强大的多线程下载工具 国外非常受欢迎 支持断点续传 支持嗅探视频音频
  • 一个 Go 开发的快速、简洁、美观、前后端分离的个人博客系统

    大家好 我是你们的章鱼猫 我们从来不含糊说推荐就推荐 所以今天给大家推荐一个 go echo vue 开发的快速 简洁 美观 前后端分离的个人博客系统 blog 同时基于这个系统也可以方便二次开发为 CMS 内容管理系统 和各种企业门户网站
  • 嵌入式 - UART使用进阶

    UART Advanced Features 概要 Overview 最简单直接的使用UART接口的方式 是在轮循操作中来设置和处理UART接口 轮询式UART的问题是轮询方式本身就是低效率的 如果我们的UART被配置为115200的波特率
  • vue踩坑之H5页面在ios的webview里面,长时间放到后台按钮失灵

    使用的前端技术栈是vue2 运行环境是在webview里面 具体的现象 在ios真机中 如果应用在后台运行几分钟再切回去 页面中的所有跳转按钮会失灵 并且报以下图片显示的错误 chunk是build之后的文件 从报错的信息来看是打包的某些文
  • 深入Java微服务之网关系列2:常见Java网关实现方案对比

    什么是服务网关 前文我们已经了解了构建微服务的基础springboot 同时也能使用springboot构建服务 接下来我们就基于springboot聊一下springcloud 这个springcloud并不是一个特定的技术 它指的是微服
  • this关键字和super关键字异同

    this关键字 1 在同一类中成员变量和局部变量名称相同时 区分两者和调用成员变量解决两者冲突问题 2 同一类中调用调用构造方法 3 指明成员方法 super关键字 1 在父类和子类中有相同变量时 调用父类变量 2 调用父类构造方法 必须放
  • 国内时间同步 ntp服务器地址

    国内时间同步 ntp服务器地址 ntp sjtu edu cn 202 120 2 101 上海交通大学网络中心NTP服务器地址 s1a time edu cn 北京邮电大学 s1b time edu cn 清华大学 s1c time ed
  • mysql8安装和驱动jar包下载

    方式一 基于docker安装 下拉镜像 docker pull mysql 8 0 21 启动镜像 docker run p 3307 3306 name mysql e MYSQL ROOT PASSWORD hadoop d mysql
  • 路由ui-router

    路由ui router Angular ngRoute针对于单视图 而ui router可用于多视图 这里说的视图是指在页面内我们可控制的 可变化的区域 比如我们点击了一个link 我们需要在视图中跳转到指定的一个页面 那么ngRoute已