详解AngularJs ui-router 路由的简单介绍
发布时间 - 2026-01-11 00:50:41 点击率:次之前有写过一篇关于Angular自带的路由:ngRoute。今天来说说Angular的第三方路由:ui-router。那么有人就会问:为什么Angular有了自带的路由,我们还需要用ui-router呢?这里简单明了的说明下ngRoute和ui-router的区别吧,其实也没很大的区别,主要的就是ngRoute针对于单视图,而ui-router可用于多视图(这里说的视图是指在页面内我们可控制的,可变化的区域)。

比如我们点击了一个link,我们需要在视图中跳转到指定的一个页面,那么ngRoute已经满足了我们的需求,而当我们点击的时候,需要在分别在不同的地方跳转两个不同的页面的时候,ngRoute就不够用了,我们就需要用到ui-router。
这里我们还是先来学习下ui-router(一些简单的服务和用法)
ui-router
$urlRouterProvider
$urlRouterProvider负责监听$location.当$location变化的时候,$urlRouterProvider开始在一个规则的列表中一个个的查找,直到找到匹配的值。$urlRouterProvider用于在后端指定url的状态配置。所有的url被编译成UrlMatcher对象。
依赖: $urlMatcherFactoryProvider $locationProvider
方法:
deferIntercept(defer);
禁用(或启用)延迟location变化的拦截。如果你想定制与URL同步的行为(例如,你需要保持当前的URL去并且推迟一个变化),那么在配置的时候使用这个方法。
参数:
defer:boolean,确定是禁止还是启用该拦截。
代码:
angular.module('Demo',['ui.router'])
.config(["$urlRouterProvider",function(){
$urlRouterProvider.deferIntercept(defer); // defer = true/false
}])
这是源码部分:
this.deferIntercept = function (defer) {
if (defer === undefined) defer = true;
interceptDeferred = defer; // 默认是true
};
otherwise(rule);
定义一个当请求的路径是无效路径时跳转的路径。
rule:你想重定向的url路径或一个返回的网址路径的规则函数。函数传入两个参数:$injector和$location服务,而且必须返回一个string的url。
代码:
angular.module('Demo',['ui.router'])
.config(["$urlRouterProvider",function(){
$urlRouterProvider.otherwise(rule); // rule = 重定向的url规则
}])
rule(rule);
定义使用$urlRouterProvider 来匹配指定的URL的规则。
参数:
rule:将$injector和$location作为arguments传入的处理函数。用来返回一个string类型的url路径。
代码:
angular.module('Demo',['ui.router'])
.config(["$urlRouterProvider",function($urlRouterProvider){
$urlRouterProvider.rule(function ($injector, $location) {
var path = $location.path(),
normalized = path.toLowerCase();
if (path !== normalized) {
return normalized;
}
});
}])
when(what,handler);
为给定的URL匹配注册一个处理程序。
参数:
what:需要重定向的传入路径。
handler:你想要重定向的路径/处理程序。
代码:
angular.module('Demo', ['ui.router']);
.config(["$urlRouterProvider",function ($urlRouterProvider) {
$urlRouterProvider.when($state.url, function ($match, $stateParams) {
if ($state.$current.navigable !== state || !equalForKeys($match, $stateParams) {
$state.transitionTo(state, $match, false);
}
});
}]);
$urlRouter
依赖:$location $rootScope $injector $browser
方法:
href(urlMacther,params,options);
一个生成URL的方法,为给定的UrlMatcher返回编译后的URL,并且用提供的参数填充。
参数:
- urlMacther:用于当作生成URL的模板的UrlMacther对象。
- params:一个参数值的对象用来填补所需的匹配参数。
- options:option对象,absolute-boolean,如果为true,将会生成一个绝对地址。
代码:
$bob = $urlRouter.href(new UrlMatcher("/about/:person"), {
person: "bob"
});
// $bob == "/about/bob";
sync();
sync();
触发更新:发生在地址栏URL变化时执行相同的更新。
$state
$state服务负责代表状态及提供状态之间的转换。它还提供你当前的状态及上一个状态。
依赖:$rootScope $q $view $injector $resolve $stateParams $urlRouter
方法:
get(stateOrName,context);返回任何指定的状态或所有状态的配置对象。
参数:
- stateOrName:如果提供此参数,返回的是指定状态的配置对象;如果不提供此参数,则返回全部状态的配置对象。
- context:当context是一个相对的参考状态,状态会在相关上下文中检索。
方法:
go(to,params,options);
参数:
- to:string,即将跳转的状态。
- params:object,跳转所带的参数。
- options:object,可选配置对象。有 location(是否更新地址栏的url,或以什么字符串替换url),inherit(是否继承当前url的参数),relative(当变化相对路径:如"^,定义的状态是相对的),notify(是否广播$stateChangeStart和$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" })
include(stateOrName,params,options);
一个确定当前有效的状态是不是与stateOrName平级的还是其子状态。
参数:
- stateOeName:string,部分名称,相对名称,或者通过当前状态进行全局模式查找。
- params:object,一个参数对象。
- options:可选配置对象。有relative。
代码:
<div ng-class="{highlighted:$state.includes('.item')}">Item</div>
$state.$current.name = 'contacts.details.item';
$state.includes("contacts"); // true
$state.includes("contacts.details"); // true
$state.includes("contacts.details.item"); // true
$state.includes("contacts.list"); // false
$state.includes("about"); // false
全局模式:
$state.$current.name = 'contacts.details.item.url';
$state.includes("*.details.*.*"); // true
$state.includes("*.details.**"); // true
$state.includes("**.item.**"); // true
$state.includes("*.details.item.url"); // true
$state.includes("*.details.*.url"); // true
$state.includes("*.details.*"); // false
$state.includes("item.**"); // false
is(stateOrName,params,options);
与$state.include相似,只是这个针对的是全名。参数性质同上。
代码:
<div ng-class="{highlighted: $state.is('.item')}">Item</div>
$state.$current.name = 'contacts.details.item';
$state.is('contact.details.item'); // true
$state.is(contactDetailItemStateObject); // true
reload(state);
重新载入当前状态的方法。
参数:
state:一个状态名称或者状态对象。
代码:
$state.reload('contact.detail');
transitionTo(to,toParams,options);
过渡到一个新状态的方法。
参数:
- to:状态名称。
- toParams:将会发送到下一个状态的参数。
- options:可选参数。有location,inherit,relative,notify,reload。
代码:
$state.transitionTo($state.current, $stateParams, {
reload: true, inherit: false, notify: true
});
事件:
1 、$stateChangeError
路由状态变化发生错误时触发的事件。参数有:event,toState,toParams,fromState,fromParams,error。以上根据字面意思即可理解,哈哈。
2、$stateChangeStart
路由状态变化发生前触发的事件。参数有:event,toState,toParams,fromState,fromParams。
3、$stateChangeSuccess
路由状态变化正确时触发的事件。参数有:event,toState,toParams,fromState,fromParams。
4、$stateNotFound
路由状态没找到的时候触发的事件。参数有:event,unfoundState,fromState,fromParams。
$stateProvider
处理路由状态的服务,路由的状态反映了该项在应用程序中的位置,描述了在当前状态下UI是应该怎么样的,并且该做什么。
依赖:$urlRouterProvider $urlMatcherFactoryProvider
方法:
decorator(name,func);
通过内部的$stateProvider以扩展或者重写状态生成器。可用于添加ui-router的自定义功能,例如,基于状态名称推断templateUrl。
警告:因为生成器的函数执行顺序的不确定,decorator不应该相互依赖。
参数:
- name:需要修改的生成函数名称。
- func:负责修改生成器函数的函数。
代码:
$stateProvider.decorator('views', function (state, parent) {
var result = {},
views = parent(state);
angular.forEach(views, function (config, name) {
var autoName = (state.name + '.' + name).replace('.', '/');
config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html';
result[name] = config;
});
return result;
});
$stateProvider.state('home', {
views: {
'contact.list': { controller: 'ListController' },
'contact.item': { controller: 'ItemController' }
}
});
$state.go('home');
以上代码修饰了“views”直接通过state的名称绑定完对应的页面模板。
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'"
})
}
注意:需要引入angular-ui-router[.min].js
这里本兽没有也不会把全部用法写一遍 -。- 写两个简单的案例仅供学习参考。这里偷个懒,把代码都写在一个页面上完成了... 毕竟花了两个晚上的空闲时间用来整理内容和写demo 考虑到第二天要上班,都是尽量的早睡,所以整理资料拖的久了些。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# angularjs
# ui
# router
# angularjs的ui
# angularjs2
# Angularjs中UI Router全攻略
# 浅析angularJS中的ui-router和ng-grid模块
# Angularjs中UI Router的使用方法
# angular基于路由控制ui-router实现系统权限控制
# 详解Angular路由 ng-route和ui-router的区别
# AngularJS路由Ui-router模块用法示例
# 深究AngularJS之ui-router详解
# Angular.js中angular-ui-router的简单实践
# 跳转
# 可选
# 将会
# 的是
# 重定向
# 你想
# 自定义
# 自带
# 绑定
# 回调
# 你想要
# 其子
# 都是
# 是一个
# 这是
# 就会
# 也不
# 可用于
# 第一个
# 也没
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
SQL查询语句优化的实用方法总结
Laravel如何配置任务调度?(Cron Job示例)
如何快速搭建高效简练网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
bing浏览器学术搜索入口_bing学术文献检索地址
如何构建满足综合性能需求的优质建站方案?
奇安信“盘古石”团队突破 iOS 26.1 提权
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
html5的keygen标签为什么废弃_替代方案说明【解答】
使用C语言编写圣诞表白程序
专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?
如何续费美橙建站之星域名及服务?
如何在万网利用已有域名快速建站?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Linux系统运维自动化项目教程_Ansible批量管理实战
如何正确下载安装西数主机建站助手?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
python中快速进行多个字符替换的方法小结
如何获取上海专业网站定制建站电话?
Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
成都网站制作公司哪家好,四川省职工服务网是做什么用?
详解Android中Activity的四大启动模式实验简述
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何在阿里云服务器自主搭建网站?
长沙企业网站制作哪家好,长沙水业集团官方网站?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
郑州企业网站制作公司,郑州招聘网站有哪些?
在线制作视频网站免费,都有哪些好的动漫网站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
黑客入侵网站服务器的常见手法有哪些?
七夕网站制作视频,七夕大促活动怎么报名?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel如何实现事件和监听器?(Event & Listener实战)
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】
Laravel如何创建自定义Facades?(详细步骤)
大同网页,大同瑞慈医院官网?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
JavaScript中如何操作剪贴板_ClipboardAPI怎么用

