Ionic2中的Navigation.md
1. 概述
为了能够得到同原生应用类似的导航效果,Ionic创建了几个navagation组件来实现pages之间的导航操作,这种导航跟原生Angular2中的route机制是不一样的,我们可以借助于一下几种方式,在Ionic中实现导航效果:
1.1. Basic Navigation
Navigation通过一个<ion-nav>
组件来实现pages之间的导航处理,<ion-nav>
组件就像是一个stack,新的页面push进入,然后pop出栈,就类似于history
接口的forward
和backward
。
每一个<ion-nav>
组件都有一个root
属性来设置其根页面。
例如定义的如下Component:
import {StartPage} from 'start'
@Component({
template: '<ion-nav [root]="rootPage"></ion-nav>'
})
class MyApp {
// First page to push onto the stack
rootPage = StartPage;
}
然后我们就可以在其root
属性指向的Root Page,以及Root Page通过push
导航到的page中,通过DI
的方式将NavController
注入,以方便通过其push
和pop
进行具体导航。
@Component({
template: `
<ion-header>
<ion-navbar>
<ion-title>Login</ion-title>
</ion-navbar>
</ion-header>
<ion-content>Hello World</ion-content>`
})
export class StartPage {
constructor(public navCtrl: NavController) {
}
}
注意:这里要强调一点,任何Component中注入的NavController
都是其直接根<ion-nav>
对应的NavController
,如下图:
各个Component中注入的NavController
对应的<ion-nav>
如下:
1、我们如何从Component Root
中获取到nav1呢?
2、我们如何从nav1中获取到nav2呢?
1.2. 从Component Root
中获取nav1
在说明这一部分前,先定义两个术语:
Root Component
:包含<ion-nav>
的根Component,例如上图中的Component Root
,当然,相对于Component A
来说其Root Component为Coponent Main
。Root Page
:组件<ion-nav>
中root
属性指向的Comonent,例如上图中的Component Main
相对于Component Root
,Component A
相对于Component Main
。
在Root Component
中是无法通过DI
的方式将NavController
注入的,那么如和获取呢?
Angular提供了一个@ViewChild注解,可以用来实现这个功能。Angular官方文档是这么解释的:
You can use ViewChild to get the first element or the directive matching the selector from the view DOM. If the view DOM changes, and a new child matches the selector, the property will be updated.
View queries are set before the
ngAfterViewInit
callback is called.
Metadata Properties:
- selector - the directive type or the name used for querying.
- read - read a different token from the queried elements.
在Ionic源码中有这么一段话:
/* ## Basic usage
* The simplest way to navigate through an app is to create and initialize a new
* nav controller using the `<ion-nav>` component. `ion-nav` extends the `NavController`
* class.
* `ion-nav` is the declarative component for a [NavController](../../../navigation/NavController/).*/
官方推荐的获取方式如下:
import { Component, ViewChild } from '@angular/core';
import { NavController } from 'ionic-angular';
@Component({
template: '<ion-nav #myNav [root]="rootPage"></ion-nav>'
})
export class MyApp {
@ViewChild('myNav') nav: NavController
public rootPage = TabsPage;
// Wait for the components in MyApp's template to be initialized
// In this case, we are waiting for the Nav with reference variable of "#myNav"
ngOnInit() {
// Let's navigate from TabsPage to Page1
this.nav.push(Page1);
}
}
1.3. 如何通过nav1获取到nav2
NavController
提供一个方法getActiveChildNav()
,官方解释如下:
Returns the active child navigation.
返回当前起作用的那个Child NavController
,所以如上图中,我们就可以在Component Root
或Component Main
中通过nav1.getActiveChildNav()
来获取nav2。
2. 高级使用
2.1. 页面导航入栈中的参数传递
导航页面入栈切换主要有如下两个方法:
push(page, params, opts)
Push a new component onto the current navigation stack. Pass any aditional information along as an object. This additional information is accessible through NavParams
Param | Type | Details |
---|---|---|
page | Page or string | The component class or deeplink name you want to push onto the navigation stack. |
params | object | Any NavParams you want to pass along to the next view.OPTIONAL |
opts | object | Nav options to go with this transition.OPTIONAL |
Returns: Promise
Returns a promise which is resolved when the transition has completed.
setRoot(page, params, opts)
Set the root for the current navigation stack.
Param | Type | Details |
---|---|---|
page | Page or string or ViewController | The name of the component you want to push on the navigation stack. |
params | object | Any NavParams you want to pass along to the next view.OPTIONAL |
opts | object | Any options you want to use pass to transtion.OPTIONAL |
Returns: Promise
Returns a promise which is resolved when the transition has completed.
可以看到push
和setRoot
方法的第二个参数都是params
, 我们可以通过这个参数来进行信息传递,举例如下:
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { OtherPage } from './other-page';
@Component({
template: `
<ion-header>
<ion-navbar>
<ion-title>Login</ion-title>
</ion-navbar>
</ion-header>
<ion-content>
<button ion-button (click)="pushPage()">
Go to OtherPage
</button>
</ion-content>
`
})
export class StartPage {
constructor(public navCtrl: NavController) {
}
pushPage(){
// push another page onto the navigation stack
// causing the nav controller to transition to the new page
// optional data can also be passed to the pushed page.
this.navCtrl.push(OtherPage, {
id: "123",
name: "Carl"
});
}
}
import { NavParams } from 'ionic-angular';
@Component({
template: `
<ion-header>
<ion-navbar>
<ion-title>Other Page</ion-title>
</ion-navbar>
</ion-header>
<ion-content>I'm the other page!</ion-content>`
})
class OtherPage {
constructor(private navParams: NavParams) {
let id = navParams.get('id');
let name = navParams.get('name');
}
}
其他的还有很多导航入栈方法,具体可以查看官方文档:
insert(insertIndex, page, params, opts)
insertPages(insertIndex, insertPages, opts)
setPages(pages, opts)
:Set the views of the current navigation stack and navigate to the last view. By default animations are disabled, but they can be enabled by passing options to the navigation controller.You can also pass any navigation params to the individual pages in the array.
2.2. 页面出栈方法
pop(opts)
popToRoot(opts)
remove(startIndex, removeCount, opts)
removeView(viewController, opts)
都比较简单,具体的查看官方文档
2.3. 其他常用方法
canGoBack()
Returns true if there’s a valid previous page that we can pop back to. Otherwise returns false.
Returns: boolean
first()
Returns the first view controller in this nav controller’s stack.
Returns: ViewController
getActive()
Returns: ViewController
Returns the active page's view controller.
getViews()
Returns the current stack of views in this nav controller.
Returns: Array
the stack of view controllers in this nav controller.
indexOf(view)
Returns the index number of the given view controller.
isActive(view)
Returns if the given view is the active view or not.
last()
Returns the last page in this nav controller’s stack.
Returns: ViewController
length()
Returns the number of views in this nav controller.
Returns: number
The number of views in this stack, including the current view.
parent
The parent navigation instance. If this is the root nav, then it’ll be null. A Tab instance’s parent is Tabs, otherwise the parent would be another nav, if it’s not already the root nav.
3. ion-navbar
组件
如果在Component
中有一个<ion-navbar>
标签定义,那么可以在<ion-navbar>
中定义<ion-title>
来改变界面的title,而且当这个Component
不是一个rootPage
的时候,就会自动添加一个回退按钮,来实现navController.pop()
相同的功能,如下图:
Template部分代码如下:
<ion-header>
<ion-navbar>
<button menuToggle *ngIf="!item">
<ion-icon name="menu"></ion-icon>
</button>
<ion-title>选择</ion-title>
</ion-navbar>
</ion-header>
参考:
https://ionicframework.com/docs/components/#navigation
https://ionicframework.com/docs/api/navigation/NavController/
Ionic2中的Navigation.md的更多相关文章
- Ionic2系列——在Ionic2中使用ECharts
在群里看到有人问怎么在Ionic2中集成ECharts来显示图表.当时答应说写个blog,简单写下步骤. 在TypeScript中如果要使用第三方库,必须要有d.ts,也就是定义文件,没有这个文件的话 ...
- Ionic2系列——在Ionic2中使用高德地图
之前讲过了如何在Ionic2中使用第三方库,因为第三方库必须针对TypeScript提供相应的声明文件——即d.ts文件,才能被TypeScript正确识别并编译.好在大多数的第三方库已经有了定义文件 ...
- Ionic2中集成腾讯Bugly之自定义插件
Ionic2混合开发,入坑系列:Ionic2中集成腾讯Bugly之自定义插件 1.编写Bugly.js代码 var exec = require('cordova/exec'); module.exp ...
- Ionic2中集成第三方控件Sweetalert
Ionic2混合开发,入坑系列:Ionic2中集成第三方控件Sweetalert 注:Sweetalert2已经可以直接从npm中下载安装 npm install --save sweetalert2 ...
- Ionic2中腾讯Bugly异常捕获以及上报
Ionic2混合开发,入坑系列:Ionic2中腾讯Bugly异常捕获以及上报 1.Ionic2中处理全局异常,直接继承IonicErrorHandler即可,代码如下 import { IonicEr ...
- ionic2中使用自定义图标
在ionic2中使用自定义图标,如iconfont(阿里巴巴矢量图标). 先在http://www.iconfont.cn/ 中找到自己需要的图标,然后将图标加入购物车,然后下载该图标. 下载完成后解 ...
- ionic2中如何使用自动生成器
ionic generator是命令行的功能,ionic2自动帮我们创建应用程序,从而节省了大量的时间,并增加我们的速度来开发一个项目的关键部分. ionic generator使我们可以自动创建以下 ...
- Ionic2中使用第三方插件极光推送
不同于Ionic1中插件的调用,Ionic2提供了Ionic Native.Ionic Native封装了一些常见的插件(如:Camera.Barcode Scanner等),这些插件的使用方式在官方 ...
- 如何在github中的readme.md加入项目截图
1. 先在之前的本地项目文件夹里创建一个存放截图的文件夹.(如img文件夹) 2. 将新增的内容通过github desktop上传到github中 3. 在github中立马能看到刚刚上传的图片,打 ...
随机推荐
- Spring表达式语言SpEL简单介绍
Spring3引入了Spring表达式语言(Spring Expression Language,SpEL). SpEL有非常多特性.比較经常使用的包含: 1.使用bean的id来引用bean, 以下 ...
- 【LeetCode】Palindrome Partitioning 解题报告
[题目] Given a string s, partition s such that every substring of the partition is a palindrome. Retur ...
- [JZOJ 4307] [NOIP2015模拟11.3晚] 喝喝喝 解题报告
题目链接: http://172.16.0.132/senior/#main/show/4307 题目: 解题报告: 题目询问我们没出现坏对的连续区间个数 我们考虑从左到有枚举右端点$r$,判断$a[ ...
- Linux安装软件的几种方式
Linux下软件安装的方式主要有源码安装,rpm安装,yum安装,而常用的安装包主要有以下三种: tar包:例如software-1.2.3-1.tar.gz.它是使用UNIX系统的打包工具tar打包 ...
- 时域,频域,s域和z域,一些网上的总结
https://www.jianshu.com/p/29f4a7663b14 https://wenku.baidu.com/view/26961183b9d528ea81c779e0.html ht ...
- EL与JSTL学习(二)——JSTL技术
1.JSTL概述 JSTL(JSP Standard Tag Library),JSP标准标签库,可以嵌入在jsp页面中使用标签的形式完成业务逻辑等功能. jstl出现的目的同el一样也是要代替jsp ...
- MySQL学习(三)——Java连接MySQL数据库
1.什么是JDBC? JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库.原来我们操作数据库是在控制台使用SQL语句来操作数据 ...
- hiho 1617 - 方格取数 - dp
题目链接 描述 给定一个NxN的方格矩阵,每个格子中都有一个整数Aij.小Hi和小Ho各自选择一条从左上角格子到右下角格子的路径,要求路径中每一步只能向右或向下移动,并且两条路径不能相交(除了左上右下 ...
- STM8S103内存详析
STM8S103的RAM有1k,0x00-0x3FF(RAM和ROM统一编址),其中0x200-0x3ff共512个字节默认为堆栈,剩余的低端512个字节又分为了Zero Page和剩余的RAM(简称 ...
- SpringBoot学习笔记(2)----配置文件取值
今天介绍三种配置文件手动取值的方式: springboot配置文件信息保存在application.properties中,默认可以spring.开头的进行spring进行一些常用参数的配置,但是很多 ...