原文地址:http://bubkoo.com/2014/01/02/angular/ui-router/guide/url-routing/
在你的应用中大多数状态都有与其相关联的 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
。
URL参数
基本参数
通常,url动态部分被称为参数,有几个选项用于指定参数。基本参数如下:
$stateProvider
.state('contacts.detail', {
// 这里设置了url参数
url: "/contacts/:contactId",
templateUrl: 'contacts.detail.html',
controller: function ($stateParams) {
// If we got here from a url of /contacts/42
expect($stateParams).toBe({contactId: 42});
}
})
或者,你也可以使用花括号的方式来指定参数:
// 与前面的设置方法等效
url: "/contacts/{contactId}"
示例:
-
'/hello/'
- 只匹配'/hello/'
路径,没有对斜杠进行特殊处理,这种模式将匹配整个路径,而不仅仅是一个前缀。
-
'/user/:id'
- 匹配'/user/bob'
、'/user/1234!!!'
,甚至还匹配'/user/'
,但是不匹配'/user'
和'/user/bob/details'
。第二个路径段将被捕获作为参数"id"
。
-
'/user/{id}'
- 与前面的示例相同,但使用花括号语法。
含正则表达式的参数
使用花括号的方式可以设置一个正则表达式规则的参数:
// 只会匹配 contactId 为1到8位的数字
url: "/contacts/{contactId:[0-9]{1,8}}"
示例:
'/user/{id:[^/]*}'
- 与'/user/{id}'
相同
-
'/user/{id:[0-9a-fA-F]{1,8}}'
- 与前面的示例相似,但只匹配1到8为的数字和字符
-
'/files/{path:.*}'
- 匹配任何以'/files/'
开始的URL路径,并且捕获剩余路径到参数'path'
中。
-
'/files/*path'
- 与前面相同,捕获所有特殊的语法。
警告:不要把捕获圆括号写进正则表达式,ui-router 的 UrlMatcher 将为整个正则表达式添加捕获。
Query Parameters
可以通过?
来指定参数作为查询参数
url: "/contacts?myParam"
// 匹配 "/contacts?myParam=value"
如果你需要不止一个查询参数,请用&
分隔:
url: "/contacts?myParam1&myParam2"
// 匹配 "/contacts?myParam1=value1&myParam2=wowcool"
嵌套状态的路由控制
附加的方式(默认)
在嵌套状态的路由控制中,默认方式是子状态的 url 附加到父状态的 url 之后。
$stateProvider
.state('contacts', {
url: '/contacts',
...
})
.state('contacts.list', {
url: '/list',
...
});
路由将成为:
-
'contacts'
状态将匹配"/contacts"
-
'contacts.list'
状态将匹配"/contacts/list"
。子状态的url是附在父状态的url之后的。
绝对路由(^)
如果你使用绝对 url 匹配的方式,那么你需要给你的url字符串加上特殊符号"^"
。
$stateProvider
.state('contacts', {
url: '/contacts',
...
})
.state('contacts.list', {
url: '^/list',
...
});
路由将成为:
-
'contacts'
状态将匹配"/contacts"
-
'contacts.list'
状态将匹配"/list"
。子状态的url没有附在父状态的url之后的,因为使用了^
。
$stateParams 服务
之前看到的$stateParams
服务是一个对象,包含 url 中每个参数的键/值。$stateParams
可以为控制器或者服务提供 url 的各个部分。
注意:$stateParams
服务必须与一个控制器相关,并且$stateParams
中的“键/值”也必须事先在那个控制器的url
属性中有定义。
// 如果状态中 url 属性是:
url: '/users/:id/details/{type}/{repeat:[0-9]+}?from&to'
// 当浏览
'/users/123/details//0'
// $stateParams 对象将是
{ id:'123', type:'', repeat:'0' }
// 当浏览
'/users/123/details/default/0?from=there&to=here'
// $stateParams 对象将是
{ id:'123', type:'default', repeat:'0', from:'there', to:'here' }
只有当状态被激活并且状态的所有依赖项都被注入时,$stateParams
对象才存在。这代表你不能再状态的resolve
函数中使用$stateParams
对象,可以使用$state.current.params
来代替。使用$stateParams
的两个陷阱
$stateProvider.state('contacts.detail', {
resolve: {
someResolve: function($state){
//*** 不能在这里使用 $stateParams , the service is not ready ***//
//*** 使用 $state.current.params 来代替 ***//
return $state.current.params.contactId + "!"
};
},
// ...
})
- 在状态控制器中,
$stateParams
对象只包含那些在状态中定义的参数,因此你不能访问在其他状态或者祖先状态中定义的参数。
$stateProvider.state('contacts.detail', {
url: '/contacts/:contactId',
controller: function($stateParams){
$stateParams.contactId //*** Exists! ***//
}
}).state('contacts.detail.subitem', {
url: '/item/:itemId',
controller: function($stateParams){
$stateParams.contactId //*** 注意! DOESN'T EXIST!! ***//
$stateParams.itemId //*** Exists! ***//
}
})
$urlRouterProvider
$urlRouterProvider
负责处理在状态配置中指定的url路由方式之外的 url 请求的路由方式。$urlRouterProvider
负责监视$location
,当$location
改变后,$urlRouterProvider
将从一个列表,一个接一个查找匹配项,直到找到。所有
url 都编译成一个UrlMatcher
对象。
$urlRouterProvider
有一些实用的方法,可以在module.config
中直接使用。
when()
for redirection 重定向
参数:
-
what
String | RegExp | UrlMatcher,你想重定向的传入路径
-
handler
String | Function将要重定向到的路径
handler
作为String
如果handler
是字符串,它被视为一个重定向,并且根据匹配语法决定重定向的地址。
app.config(function($urlRouterProvider){
// when there is an empty route, redirect to /index
$urlRouterProvider.when('', '/index');
// You can also use regex for the match parameter
$urlRouterProvider.when('/aspx/i', '/index');
})
函数可以返回:handler
作为Function
如果handler
是一个函数,这个函数是注入一些服务的。如果$location
匹配成功,函数将被调用。你可以选择性注入$match
。
-
falsy表明规则不匹配,
$urlRouter
将试图寻找另一个匹配
-
String该字符串作为重定向地址并且作为参数传递给
$location.url()
-
nothing或者任何为真的值,告诉
$urlRouter
url 已经被处理
示例:
$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
$state.transitionTo(state, $match, false);
}
}]);
参数:otherwise()
无效路由
-
path
String | Function你想重定向url路径或者一个函数返回url路径。函数可以包含$injector
和$location
两个参数。
app.config(function($urlRouterProvider){
// 在配置(状态配置和when()方法)中没有找到url的任何匹配
// otherwise will take care of routing the user to the specified url
$urlRouterProvider.otherwise('/index');
// Example of using function rule as param
$urlRouterProvider.otherwise(function($injector, $location){
... some advanced code...
});
})
参数:rule()
自定义url处理
-
handler
Function一个函数,包含$injector
和$location
两个服务作为参数,函数负责返回一个有效的路径的字符串。
app.config(function($urlRouterProvider){
// Here's an example of how you might allow case insensitive urls
$urlRouterProvider.rule(function ($injector, $location) {
var path = $location.path(), normalized = path.toLowerCase();
if (path != normalized) return normalized;
});
})
$urlMatcherFactory 和 UrlMatchers
定义了url模式和参数占位符的语法。$urlMatcherFactory
是在幕后被$urlRouterProvider
调用,来缓存编译后的UrlMatcher
对象,而不必在每次
location 改变后重新解析url。大多数用户不需要直接使用$urlMatcherFactory
方法,但是在状态配置中非常实用,可以使用$urlMatcherFactory
方法来生成一个UrlMatcher
对象,并在状态配置中使用该对象。
var urlMatcher = $urlMatcherFactory.compile("/home/:id?param1");
$stateProvider.state('myState', {
url: urlMatcher
});
分享到:
相关推荐
默认的AngularJS路由模块ngRoute可以实现基本的路由需求,但当项目变得复杂,涉及到多个视图和嵌套路由时,UI-Router就显得更为强大。 UI-Router的核心概念包括状态(States)和视图(Views)。状态定义了应用的...
AngularJS UI.Router是一个强大的路由模块,它为AngularJS应用程序提供了更复杂的导航结构和状态管理功能。这个"angularjs ui.router嵌套路由demo"是展示如何在AngularJS项目中使用UI.Router进行多级路由配置和页面...
AngularJS的UI-Router是一个强大的路由管理库,它允许开发者以更加灵活的方式组织和管理应用的视图和状态。在本文中,我们将深入探讨UI-Router中的状态嵌套和视图嵌套,这对于构建复杂、多层级的单页应用程序(SPA)...
2. **配置AngularJS**:定义应用模块,注入所需的AngularJS服务,如$stateProvider和$urlRouterProvider,以便配置UI-Router的状态路由。 3. **定义状态和视图**:使用UI-Router的API定义应用的状态,每个状态可以...
在本文中,我们将深入探讨如何使用AngularJS、RequireJS和Angular-UI-Router构建一个高效且模块化的前端应用。AngularJS是一种流行的JavaScript框架,用于构建动态网页应用;RequireJS是AMD(Asynchronous Module ...
ui-router是AngularJS中用于管理复杂应用状态和路由的一个扩展模块。在使用ui-router构建单页面应用(SPA)时,经常需要刷新特定的路由或子路由,以更新视图、模型或控制器。在AngularJS应用中,刷新子页面路由是一...
原生的ngRoute仅支持简单的URL到控制器的映射,而UI-Router则增加了状态管理、嵌套路由、命名视图等功能。这个文件是UI-Router的压缩版,同样适用于生产环境。使用UI-Router,开发者可以定义多个视图在一个状态中,...
ui-router是AngularJS的一个第三方模块,它扩展了原生的ng-route,提供了更强大的功能,包括支持嵌套路由和命名视图。在本文中,我们将深入探讨如何使用ui-router实现嵌套路由,以及它如何帮助我们构建更复杂的单页...
AngularJS中的ui-router模块是实现客户端应用程序中复杂状态管理的一个非常有用的库,它支持单页应用(SPA)中的多视图和嵌套路由管理。 在使用ui-router来实现多层嵌套路由时,开发者需要按照ui-router的状态配置...
UI-Router是AngularJS的一个扩展模块,提供了更高级的路由功能,如嵌套路由、命名视图和并行视图等。 标题“angular.js ui-router 用法示例demo”指的是一个展示AngularJS中UI-Router实际应用的实例。这个示例旨在...
创建一个AngularJS模块,并注入`ui.router`作为依赖。例如: ```javascript var app = angular.module('myApp', ['ui.router']); ``` 3. **配置状态(states)** `UI-Router`使用`$stateProvider`来定义和...
AngularJs ui-router是AngularJs的一个第三方路由模块,它提供了更为强大和灵活的状态管理能力,相较于AngularJs自带的ngRoute模块,ui-router支持复杂的路由需求,例如多视图的场景。 ngRoute是AngularJs原生的...
**AngularJS UI-Router**是AngularJS框架中的一个强大路由模块,它提供了更高级的导航和视图管理功能,使得在构建复杂的单页应用程序(SPA)时更加灵活和可维护。这个压缩包“angular-ui-router.zip”包含了UI-...
UI-Router被认为是AngularUI为开发者提供的最实用的一个模块,它是一个让开发者能够根据URL状态或者说是'机器状态'来组织和控制界面UI的渲染,而不是仅仅只改变路由(传统AngularJS应用实用的方式)。该模块为开发者...
ui-router是AngularJS中的一个路由模块,它在ng-route模块的基础上提供了更多的灵活性和强大的功能,尤其适合构建复杂的页面应用。 在ui-router中,resolve是一个非常有用的属性,它允许我们在路由变化之前预先解析...
接下来,我们需要创建一个AngularJS模块,并注入`ui.router`依赖。在以下代码中,我们创建了一个名为`myApp`的模块,并将`ui.router`作为依赖注入: ```javascript var app = angular.module('myApp', ['ui.router'...
在原生的AngularJS路由中,我们通常使用`ngRoute`模块和`$routeProvider`来定义路由,如示例所示,通过`.when()`方法为不同的URL路径指定对应的模板和控制器。然而,这种简单的路由方式并不支持视图的嵌套,即一个...
接着,需要创建一个AngularJS模块,并且在这个模块中配置UI Router的状态。这个模块就是整个应用的入口点。在AngularJS中,模块通常通过ng-app指令指定在HTML的根节点上,比如: ```html <body ng-app="formApp"> `...