ui-router 的工作原理非常类似于 Angular 的路由控制器,但它只关注状态。
• 在应用程序的整个用户界面和导航中,一个状态对应于一个页面位置
• 通过定义controller、template和view等属性,来定义指定位置的用户界面和界面行为
• 通过嵌套的方式来解决页面中的一些重复出现的部位
最简单的形式
模板可以通过下面这种最简单的方式来指定

<!-- in index.html -->
// in app-states.js (or whatever you want to name it)
stateProvider.state('contacts', {
template: '<h1>My Contacts</h1>'
})

模板将被插入哪里?
状态被激活时,它的模板会自动插入到父状态对应的模板中包含ui-view属性的元素内部。如果是顶层的状态,那么它的父模板就是index.html。
激活状态
有三种方法来激活状态:
1 调用\)state.go()方法,这是一个高级的便利方法;
2 点击包含ui-sref指令的链接;
3 导航到与状态相关联的 url。
Templates 模板
可以通过下面几种方法来配置一个状态的模板。
方法一:配置template属性,指定一段 HTML 字符串,这人是设置模板的最简单的方式

stateProvider.state('contacts', {
template: '<h1>My Contacts</h1>'
})

方法二:配置templateUrl属性,来加载指定位置的模板,这是设置模板的常用方法。

stateProvider.state('contacts', {
templateUrl: 'contacts.html'
})

templateUrl的值也可以是一个函数返回的url,函数带一个预设参数stateParams。

stateProvider.state('contacts', {
templateUrl: function (stateParams){
return '/partials/contacts.' + stateParams.filterBy + '.html';
}
})

方法三:通过templateProvider函数返回模板的 HTML。

stateProvider.state('contacts', {
templateProvider: function (timeout, stateParams) {
return timeout(function () {
return '<h1>' + stateParams.contactId + ''
}, 100);
}
})

如果想在状态被激活前,让有一些默认的内容,当状态被激活之后默认内容将被状态对应的模板替换。

Some content will load here!

Controllers 控制器
可以为模板指定一个控制器(controller)。警告:控制器不会被实例化如果模板没有定义。
设置控制器:

stateProvider.state('contacts', {
template: '<h1>{{title}}</h1>',
controller: function(scope){
scope.title = 'My Contacts';
}
})

如果在模块中已经定义了一个控制器,只需要指定控制器的名称即可:

stateProvider.state('contacts', {
template: ...,
controller: 'ContactsCtrl'
})

使用controllerAs语法:

stateProvider.state('contacts', {
template: ...,
controller: 'ContactsCtrl as contact'
})

对于更高级的需要,可以使用controllerProvider来动态返回一个控制器函数或字符串:

stateProvider.state('contacts', {
template: ...,
controllerProvider: function(stateParams) {
var ctrlName = stateParams.type + "Controller";
return ctrlName;
}
})

控制器可以使用\(scope.on()方法来监听事件状态转换。
控制器可以根据需要实例化,当相应的scope被创建时。例如,当用户点击一个url手动导航一个状态时,\)stateProvider将加载对应的模板到视图中,并且将控制器和模板的scope绑定在一起。
解决器 Resolve
可以使用resolve为控制器提供可选的依赖注入项。
resolve配置项是一个由key/value构成的对象。
• key – {string}:注入控制器的依赖项名称。
• factory - {string|function}:
◦ string:一个服务的别名
◦ function:函数的返回值将作为依赖注入项,如果函数是一个耗时的操作,那么控制器必须等待该函数执行完成(be resolved)才会被实例化。
例子
在controller实例化之前,resolve中的每一个对象都必须 be resolved,请注意每个 resolved object 是怎样作为参数注入到控制器中的。

$stateProvider.state('myState', {
resolve:{ // Example using function with simple return value.
// Since it's not a promise, it resolves immediately.
simpleObj: function(){
return {value: 'simple!'};
}, // Example using function with returned promise.
// 这是一种典型使用方式
// 请给函数注入任何想要的服务依赖,例如 $http
promiseObj: function($http){
// $http returns a promise for the url data
return $http({method: 'GET', url: '/someUrl'});
}, // Another promise example.
// 如果想对返回结果进行处理, 可以使用 .then 方法
// 这是另一种典型使用方式
promiseObj2: function($http){
return $http({method: 'GET', url: '/someUrl'})
.then (function (data) {
return doSomeStuffFirst(data);
});
}, // 使用服务名的例子,这将在模块中查找名称为 'translations' 的服务,并返回该服务
// Note: The service could return a promise and
// it would work just like the example above
translations: "translations", // 将服务模块作为解决函数的依赖项,通过参数传入
// 提示:依赖项 $stateParams 代表 url 中的参数
translations2: function(translations, $stateParams){
// Assume that getLang is a service method
// that uses $http to fetch some translations.
// Also assume our url was "/:lang/home".
translations.getLang($stateParams.lang);
}, // Example showing returning of custom made promise
greeting: function($q, $timeout){
var deferred = $q.defer();
$timeout(function() {
deferred.resolve('Hello!');
}, 1000);
return deferred.promise;
}
}, // 控制器将等待上面的解决项都被解决后才被实例化
controller: function($scope, simpleObj, promiseObj, promiseObj2, translations, translations2, greeting){ $scope.simple = simpleObj.value; // 这里可以放心使用 promiseObj 中的对象
$scope.items = promiseObj.items;
$scope.items = promiseObj2.items; $scope.title = translations.getLang("english").title;
$scope.title = translations2.title; $scope.greeting = greeting;
}
})

为 state 对象提供自定义数据
可以给 state 对象提供自定义数据(建议使用data属性,以免冲突)
// 基于对象和基于字符串定义 state 的例子

var contacts = {
name: 'contacts',
templateUrl: 'contacts.html',
data: {
customData1: 5,
customData2: "blue"
} }
stateProvider
.state(contacts)
.state('contacts.list', {
templateUrl: 'contacts.list.html',
data: {
customData1: 44,
customData2: "red"
}
})

可以通过下面的方式来访问上面定义的数据:

function Ctrl(state){
console.log(state.current.data.customData1) // 输出 5;
console.log(state.current.data.customData2) // 输出 "blue";
}

onEnter 和 onExit 回调函数
onEnter和onExit回调函数是可选配置项,分别称为当一个状态变得活跃的和不活跃的时候触发。回调函数也可以访问所有解决依赖项。

stateProvider.state("contacts", {
template: '<h1>{{title}}</h1>',
resolve: { title: 'My Contacts' },
controller: function(scope, title){
scope.title = 'My Contacts';
},
// title 是解决依赖项,这里也是可以使用解决依赖项的
onEnter: function(title){
if(title){ ... do something ... }
},
// title 是解决依赖项,这里也是可以使用解决依赖项的
onExit: function(title){
if(title){ ... do something ... }
}
})

State Change Events 状态改变事件
所有这些事件都是在\)rootScope作用域触发
• stateChangeStart - 当模板开始解析之前触发

rootScope.on('stateChangeStart',
function(event, toState, toParams, fromState, fromParams){ ... })

注意:使用event.preventDefault()可以阻止模板解析的发生

rootScope.on('$stateChangeStart',
function(event, toState, toParams, fromState, fromParams){
event.preventDefault();
// transitionTo() promise will be rejected with
// a 'transition prevented' error
})
•   $stateNotFound - v0.3.0 - 在 transition 时通过状态名查找状态,当状态无法找到时发生。该事件在 scope 链上广播,只允许一次处理错误的机会。unfoundState将作为参数传入事件监听函数,下面例子中可以看到unfoundState的三个属性。使用 event.preventDefault() 来阻止模板解析,
// somewhere, assume lazy.state has not been defined
$state.go("lazy.state", {a:1, b:2}, {inherit:false}); // somewhere else
scope.on('stateNotFound',
function(event, unfoundState, fromState, fromParams){
console.log(unfoundState.to); // "lazy.state"
console.log(unfoundState.toParams); // {a:1, b:2}
console.log(unfoundState.options); // {inherit:false} + default options
})

• stateChangeSuccess - 当模板解析完成后触发

rootScope.on('stateChangeSuccess',
function(event, toState, toParams, fromState, fromParams){ ... })

• stateChangeError - 当模板解析过程中发生错误时触发

rootScope.on('stateChangeError',
function(event, toState, toParams, fromState, fromParams, error){ ... })

View Load Events 视图加载事件
• viewContentLoading - 当视图开始加载,DOM渲染完成之前触发,该事件将在\(scope链上广播此事件。

scope.on('viewContentLoading',
function(event, viewConfig){
// Access to all the view config properties.
// and one special property 'targetView'
// viewConfig.targetView
});
• viewContentLoaded - 当视图加载完成,DOM渲染完成之后触发,视图所在的\)scope发出该事件。
scope.on('viewContentLoading',
scope.on('viewContentLoaded',
function(event){ ... });

ionic路由(页面切换)的更多相关文章

  1. Ionic学习笔记4_ionic路由(页面切换)

    1.1.  ionic路由机制: 状态 1.2.  ion-nav-view <body ng-controller="firstCtrl"> <a class= ...

  2. 单页应用 WebApp SPA 骨架 框架 路由 页面切换 转场

    这里收录三个同类产品,找到他们花了我不少时间呢. 张鑫旭写的mobilebone自述:mobile移动端,PC桌面端页面无刷新过场JS骨架,简单.专注!http://www.zhangxinxu.co ...

  3. ionic-native-transitions调用原生页面切换实现ionic路由切换

    废话不多说:ionic-native-transitions调用原生页面切换实现ionic路由切换,从而大大提升ionic应用的性能. ionic-native-transitions是一个ionic ...

  4. ionic入门教程-ionic路由详解(state、route、resolve)(转)

    http://blog.csdn.net/onil_chen/article/details/51758696?appinstall=0 今天好好的跟大家讲讲ionic的路由配置. 问到的朋友有点多, ...

  5. vue-lazy-render: 延迟渲染大组件,增强页面切换流畅度

    最近用element来做项目,在开发的过程中,突然发现页面的操作和切换在数据量大的时候相当卡,后来提了个issue,在furybean解答后才知道,我每个单元格都加了tooltip,会生成大量的节点, ...

  6. ionic路由传值

    ionic路由传值 app.js ===================================== //新建工作任务.state(‘app.newTask’, angularAMD.rout ...

  7. ionic单页面应用中微信分享的问题总结

    首先说一下 ionic 是单页面应用,也就是说整个项目就有一个index.html, 那么问题就就来了, 如果我们不同的页面要分享给大家的是不同的链接和图片,应该怎么去做呢? 这就是我们今天要总结的东 ...

  8. ionic 跨页面传值的几种方法

    1.使用AngularJS自带的$cacheFactory服务 $cacheFactory 从字面直译即为缓存工厂,可以用它来生成缓存对象,缓存对象以key-value的方式进行数据的存储,在整个应用 ...

  9. AngularJS应用页面切换优化方案

    葡萄城的一款尚在研发中的产品,对外名称暂定为X项目.其中使用了已经上市的Wijmo中SpreadJS产品,另外,在研发过程中整理了一些研发总结分享给大家.如本篇的在页面切换的过程中优化方案,欢迎大家跟 ...

随机推荐

  1. NOIP2016 组合数问题

    https://www.luogu.org/problem/show?pid=2822 题目描述 组合数表示的是从n个物品中选出m个物品的方案数.举个例子,从(1,2,3) 三个物品中选择两个物品可以 ...

  2. 2008ZJOI树的统计

    codevs 2460 树的统计 http://codevs.cn/problem/2460/ 2008年省队选拔赛浙江  题目等级 : 大师 Master   题目描述 Description 一棵 ...

  3. UNDERSTANDING THE GAUSSIAN DISTRIBUTION

    UNDERSTANDING THE GAUSSIAN DISTRIBUTION Randomness is so present in our reality that we are used to ...

  4. 七、Kafka 用户日志上报实时统计之编码实践

    一.数据生产实现 1.配置数据生产模块 项目基础配置所包含的内容,如下所示: •项目工程的文件配置 •集群连接信息配置 •开发演示 2.实现 Flume 到 Kafka 模块 实现 Flume 到 K ...

  5. [转载]WCF和ASP.NET Web API在应用上的选择

    http://www.cnblogs.com/shanyou/archive/2012/09/26/2704814.html http://msdn.microsoft.com/en-us/libra ...

  6. 用JS获得QQ号码的昵称,头像,生日

    有一个网址,可以返回我们要的内容. http://r.qzone.qq.com/cgi-bin/user/cgi_personal_card?uin=指定QQ号码 将会返回下列内容: _Callbac ...

  7. SQL查找数据库中所有没有主键的数据表脚本

    --SQL查找数据库中所有没有主键的数据表脚本 --运行脚本后在消息中可能会显示下面现象中的一种:--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)--(2)当前数据表[数据表名]没有主 ...

  8. 软件测试工程师人手必备的一只:TOM猫,可以带你装逼带你飞!

    Hi,你来了? 其实没有猫,为了让你们好好学习,天天向上!我可真的是拼了命了! 写这篇文章的缘由是,近期有同学经常问到一个这样的问题: 老师,tomcat是啥? 老师,Linux是啥? 老师,xshe ...

  9. 大规模实时流处理平台架构-zz

    随着不同网络质量下接入终端设备种类的增多,服务端转码已经成为视频点播和直播产品中必备的能力之一.直播产品讲究时效性,希望在一定的时间内让所有终端看到不同尺寸甚至是不同质量的视频,因此对转码的实时性要求 ...

  10. C++学习之路(十一):C++的初始化列表

    结论: 1.在C++中,成员变量的初始化顺序与变量在类型中的声明顺序相同,而与他们在构造函数的初始化列表中的顺序无关. 2.构造函数分为两个阶段执行:1)初始化阶段:2)普通的计算阶段,表现为赋值操作 ...