angularJs模块ui-router之路由控制
在你的应用中大多数状态都有与其相关联的 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 重定向
参数:
whatString | RegExp | UrlMatcher,你想重定向的传入路径handlerString | 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或者任何为真的值,告诉
$urlRouterurl 已经被处理
示例:

$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
$state.transitionTo(state, $match, false);
}
}]);

参数:otherwise() 无效路由
pathString | 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处理
handlerFunction 一个函数,包含$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
});
原文地址:http://bubkoo.com/2014/01/02/angular/ui-router/guide/url-routing/
angularJs模块ui-router之路由控制的更多相关文章
- AngularJS 使用 UI Router 实现表单向导
Today we will be using AngularJS and the great UI Router and the Angular ngAnimate module to create ...
- [转]AngularJS 使用 UI Router 实现表单向导
本文转自:http://www.oschina.net/translate/angularjs-multi-step-form-using-ui-router 今天我们将使用AngularJs和伟大的 ...
- [转]AngularJS+UI Router(1) 多步表单
本文转自:https://www.zybuluo.com/dreamapplehappy/note/54448 多步表单的实现 在线demo演示地址https://rawgit.com/dream ...
- angularjs ngRoute和ui.router对比
ngRoute模块是angularjs自带的路由模块,ui.router是一个第三方路由模块,接下来将对两者进行一个对比: ng-router(angular-router.js) ng-view n ...
- angularJS ui router 多视图单独刷新问题
场景:视图层级如下 view1 --view11 --view111 需求:view11的一个动作过后,单独刷新view12 解决方式:修改层级设计 view1 --view11 --view111 ...
- Router和History (路由控制)-backbone
Router和History (路由控制) Backbone.Router担任了一部分Controller(控制器)的工作,它一般运行在单页应用中,能将特定的URL或锚点规则绑定到一个指定的方法(后文 ...
- angular ui.router 路由传参数
angular已经用了一段时间了,最近在做路由,做一下笔记. 路由跳转的时候进行穿参 ui.router方式 <a ui-sref="edit({id:5})"> 编辑 ...
- ngRoute 和 ui.router 的使用方法和区别
在单页面应用中要把各个分散的视图给组织起来是通过路由机制来实现的.本文主要对 AngularJS 原生的 ngRoute 路由模块和第三方路由模块 ui.router 的用法进行简单介绍,并做一个对比 ...
- 【nodejs笔记3】Express基本用法,和路由控制,和模板渲染ejs
1. 路由控制的工作原理 //routes/index.js中的代码//访问主页时,调用ejs模板引擎,渲染index.ejs模板文件,生成静态页面,并显示在浏览器中.router.get('/', ...
随机推荐
- Golang(笔记) 顺序编程
package main import ( "fmt" "bufio" "io" "os" "strconv& ...
- android 双缓存机制
废话不多说,直接贴代码! 所谓的双缓存,第一就是缓存在内存里面,第二就是缓存在SD卡里面,当你需要加载数据时,先去内存缓存中查找,如果没有再去SD卡中查找,并且用户可以自选使用哪种缓存! 缓存内存和缓 ...
- 在CentOS7上安装JDK1.8
在CentOS7上安装JDK1.8 1 通过 SecureCRT 连接到阿里云 CentOS7 服务器: 2 进入到目录 /usr/local/ 中: cd /usr/local/ 3 创建目录 to ...
- Play Framework 完整实现一个APP(四)
上一篇最后出现的错误是因为断言 assertEquals(1, Post.count()); 出错,取到的Post的数量不是1,运行Test之前,表中有数据 可以添加以下方法,运行Test前清空数据 ...
- 【ps】裁剪图片的某一块
最近做我趣的专辑学了一点小技巧,我们切图的时候可能需要改变图片上的文字.需要图片某一部分的颜色块进行覆盖等.这时候就需要下面的技巧啦: 第一步:点v,变箭头选中图片 第二部:点M,变矩形框,划出需要裁 ...
- parawork平台介绍
ParaWork软件项目估算平台---科学估算项目,让管理更简单 ParaWork软件项目估算平台是由北京软件造价评估技术创新联盟与北京科信深度科技有限公司联合开发.维护的软件项目估算工具,为会员免 ...
- SQL Server 2008 R2 Service Pack 3 已经发布
微软SQL Server Product Team在9月26号官方博客宣布,Microsoft SQL Server 2008 R2 Service Pack 3 (SP3)正式发布了 .具体信息可以 ...
- C#winfrom播放器动态加载歌词
上周我们进行了结业项目答辩,是播放器项目.有一个关于播放器变唱歌边加载歌词的方法特别有意思,像酷狗那样子歌词和歌曲同步滚播的样子. 这里的工具是Visual Studio 2013,使用语言是C#和. ...
- 烂泥:haproxy学习之https配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 在前一段时间,我写了几篇有关学习haproxy的文章.今天我们再来介绍下haproxy ...
- jQuery validator自定义
项目中接触到validator,记录下 jQuery.validator.addMethod("isStrongPwd", function(value, element){ va ...