GitHub地址:https://github.com/JerryMissTom ,歡迎關注
這是ionic 開發踩坑的第三篇文章,前兩篇參見:ionic V3.10 開發踩坑集錦(一) ,ionic V3.10 開發踩坑集錦(二) 開發環境與上文保持一致。
從Tab介面跳轉到Login介面並隱藏Tab
我們的APP主頁使用最常見的底部 Tab
,設定介面中退出登入會跳轉到 Login
介面。一開始使用的是 NavController.setRoot();
,然後Login
介面中 Tab
會展示出來,使用其他手段隱藏 Tab
,但是不優雅。後來查詢到一個很好的方法,如下:
import { App } from 'ionic-angular/components/app/app';
constructor(
private app: App
)
toLoginPage(){
this.app.getRootNavs()[0].setRoot(LoginPage);
// 需要注意的是網上最常見的是下面的寫法,但是getRootNav方法被廢棄掉
// this.app.getRootNav().setRoot(LoginPage);
}
複製程式碼
在Tab介面中輸入法喚起時隱藏Tab
Tab的一個介面中有input輸入框,當輸入文字喚起輸入法的時候,tab仍然存在,需要隱藏。具體做法如下:
- 安裝Keyboard外掛
ionic cordova plugin add ionic-plugin-keyboard
npm install --save @ionic-native/keyboard
複製程式碼
- app.module.ts 中
import { Keyboard } from '@ionic-native/keyboard';
...
providers:[Keyboard]
複製程式碼
- tab設定
tab.html
<ion-tabs #myTabs>
...
</ion-tabs>
複製程式碼
tab.ts
import { Component, ElementRef, Renderer, ViewChild } from '@angular/core';
import { Keyboard } from '@ionic-native/keyboard';
import { Events, Tabs } from 'ionic-angular';
@Component({
templateUrl: 'tabs.html'
})
export class TabsPage {
@ViewChild('myTabs') tabRef: Tabs;
mb: any;
constructor(private elementRef: ElementRef,
private renderer: Renderer,
private keyboard: Keyboard,
private event: Events) {
}
ionViewDidLoad() {
let tabs = this.queryElement(this.elementRef.nativeElement, '.tabbar');
this.event.subscribe('hideTabs', () => {
this.renderer.setElementStyle(tabs, 'display', 'none');
let SelectTab = this.tabRef.getSelected()._elementRef.nativeElement;
let content = this.queryElement(SelectTab, '.scroll-content');
this.mb = content.style['margin-bottom'];
this.renderer.setElementStyle(content, 'margin-bottom', '0')
});
this.event.subscribe('showTabs', () => {
this.renderer.setElementStyle(tabs, 'display', '');
let SelectTab = this.tabRef.getSelected()._elementRef.nativeElement;
let content = this.queryElement(SelectTab, '.scroll-content');
this.renderer.setElementStyle(content, 'margin-bottom', this.mb)
});
}
queryElement(elem: HTMLElement, q: string): HTMLElement {
return <HTMLElement>elem.querySelector(q);
}
// 一定記得要取消訂閱,網上很多沒寫這個,會帶來隱藏的Bug
ionViewWillUnload() {
this.event.unsubscribe('hideTabs');
this.event.unsubscribe('showTabs');
}
}
複製程式碼
- 使用介面設定
about.ts
import { Subscription } from 'rxjs/Subscription';
import { Keyboard } from '@ionic-native/keyboard';
...
export class About {
private hideSubscription: Subscription;
private showSubscription: Subscription;
construct(
private keyboard: Keyboard,
private event: Events
){
this.hideSubscription = null;
this.showSubscription = null;
}
ionViewDidEnter() {
this.hideSubscription = this.keyboard.onKeyboardShow().subscribe(() => this.event.publish('hideTabs'));
this.showSubscription = this.keyboard.onKeyboardHide().subscribe(() => this.event.publish('showTabs'));
}
ionViewWillLeave() {
this.keyboard.close();
if (this.hideSubscription) {
this.hideSubscription.unsubscribe();
this.hideSubscription = null;
}
if (this.showSubscription) {
this.showSubscription.unsubscribe();
this.showSubscription = null;
}
}
複製程式碼
ionic
介面的生命週期
ionViewDidLoad
只在介面建立的時候執行一次,假如此介面被快取,重新進入後,不會被觸發,可用於一些資料的初始化或賦值。
ionViewDidEnter
只要在介面變為 active
時候就觸發一次,不管此介面是第一建立還是從快取中獲取。可用於每次進入介面中的網路重新整理。
ionViewWillLeave
在介面將要消失,不再 active
的時候觸發。
ionViewWillUnload
在介面將被 destroy
掉,不再存在時候觸發,這個時候可以執行取消訂閱事件。
ionViewCanEnter
在介面進入之前判斷是否滿足條件或許可權
ionViewCanLeave
在介面離開之前判斷是否滿足條件或許可權
推薦
最後推薦下我寫的ionic的小專案,具體可以參見 適合ionic初學者的小專案