ui-router的使用总结
参考网址:https://github.com/angular-ui/ui-router 版本1
版本2:https://github.com/angular-ui/ui-router/tree/legacy
http://www.cnblogs.com/ys-ys/p/5052660.html
(ui-router可用于多视图)
ui-router介绍
$urlRouterProvider
$urlRouterProvider负责监听$location.当$location变化的时候,
$urlRouterProvider开始在一个规则的列表中一个个的查找,直到找到匹配的值。
$urlRouterProvider用于在后端指定url的状态配置。所有的url被编译成UrlMatcher对象。
依赖: $urlMatcherFactoryProvider $locationProvider
方法:
1.deferIntercept(defer);
禁用(或启用)延迟location变化的拦截。如果你想定制与URL同步的行为(例如,你需要保持当前的URL去并且推迟一个变化),那么在配置的时候使用这个方法。
参数:
defer:boolean,确定是禁止还是启用该拦截。
代码: angular.module('Demo',['ui.router'])
.config(["$urlRouterProvider",function(){
$urlRouterProvider.deferIntercept(defer); // defer = true/false
}])
2.otherwise(rule);
定义一个当请求的路径是无效路径时跳转的路径。
rule:你想重定向的url路径或一个返回的网址路径的规则函数。函数传入两个参数:$injector和$location服务,而且必须返回一个string的url。
代码: angular.module('Demo',['ui.router'])
.config(["$urlRouterProvider",function(){
$urlRouterProvider.otherwise(rule); // rule = 重定向的url规则
}])
3.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;
}
});
}])
4.$state
方法:
(1)go(to,params,options);
参数:
to:string,即将跳转的状态。
params:object,跳转所带的参数。
options:object,可选配置对象。有 location(是否更新地址栏的url,或以什么字符串替换url),
inherit(是否继承当前url的参数),relative(当变化相对路径:如"^,定义的状态是相对的),
notify(是否广播$stateChangeStart和$stateChangeSuccess事件),reload(是否重新载入)。
$state.go('test.detail');
(2)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" })
(3)include(stateOrName,params,options);
(4)reload(state);
重新载入当前状态的方法。
参数:
state:一个状态名称或者状态对象。
代码: $state.reload('contact.detail');
参数:
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里的参数值,通过它可以实现页面间的参数传递。
简单使用方法
1.bower install angular-ui-router --save 安装
2.引入 <script src="bower_components/angular-ui-router/release/angular-ui-router.js"></script>
3.注入angular .module('ejt1GatewayApp', [ 'ui.router' ])
<div ui-view="root"></div>
配置路由
(function() {
'use strict';
angular
.module('testApp')
.config(stateConfig)
stateConfig.$inject = ['$stateProvider','$urlRouterProvider'];
function stateConfig($stateProvider,$urlRouterProvider) {
$urlRouterProvider.otherwise("/testQrcodePay");
$stateProvider
.state('testUrl', {
url: "/testQrcodePay",
templateUrl: "view/testurl.html",
controller: 'testController'
})
}
})();
6.控制器
(function() {
'use strict';
angular.module('testApp')
.controller('testController',testController)
testController.$inject=['$scope','$state']
function testController($scope,$state){
$state.go('testQrcodePayUrl')
}
})();
7.路由跳转方式
(1)$state.go("statename")
(2)ui-sref="statename"
8.路由传参方式(通过url传参数)
(1)ui-sref="statename({parmas:需要传的参数})"
eg:
.state('test', {
parent:'root',
url: '/test/:parmas',
views: {
'content': {
templateUrl: 'test.html',
controller:'testController'
}
}
})
or
.state('test', {
parent:'root',
url: '/test/{parmas}',
views: {
'content': {
templateUrl: 'test.html',
controller:'testController'
}
}
})
在testController里注入$stateParams,
通过$scope.getparmas=$stateParams.parmas;获取路由传过来的参数
路由传参可以是一个对象,也可以是一个变量(如果传对象,需要将其包装成一个json,JSON.stringify(parmas))
$state.go('teststate', {parmas: JSON.stringify(statesobjects) },{reload:true});
{reload:true}表示重新加载该页面
多视图用@,嵌套用parent.child这种子路由
>