Изменение динамических вкладок в Ionic 2
Я создаю приложение Ionic, в котором я использую вкладки. Я хочу иметь возможность перемещаться с одной вкладки на другую с помощью класса компонентов typescript, прикрепленного к шаблону табуляции. Например, вкладка 2 должна быть активирована после запуска события на вкладке 1.
Моя вкладка хорошо загружается на вкладках, и все хорошо, пока я вручную нажимаю на вкладку, чтобы перемещаться, но попытка переключить контекст в коде позади была очень сложной.
В момент загрузки я могу активировать любую из активных вкладок, просто установив атрибут [selectedIndex] вкладки ion в значение атрибута в моем классе компонентов вкладок.
Шаблоны родительских вкладок - tab.html
<ion-tabs #tabParent [selectedIndex]="tabToShow">
<ion-tab tabTitle="Tab 1" [root]="tab2" [rootParams]="{parent : tabParent}"></ion-tab>
<ion-tab tabTitle="Tab 2" [root]="tab2" [rootParams]="{parent : tabParent}></ion-tab>
<ion-tab tabTitle="Tab 3" [root]="tab3" [rootParams]="{parent : tabParent}></ion-tab>
</ion-tabs>
Компонент - tab.ts
import {Page} from 'ionic-angular';
import {Tab1} from '../tab1/tab1.ts';
import {Tab2} from '../tab2/tab2.ts';
import {Tab3} from '../tab3/tab3.ts';
@Page({
templateUrl : 'build/pages/tab/tab.html'
})
export class Tab{
tab1: any;
tab2: any;
tab3: any;
tabToShow : number = 1;
ngOnInit(){
this.tab1 = Tab1;
this.tab2 = Tab2;
this.tab3 = Tab3;
}
}
В компоненте для первой вкладки (Tab1
) я могу получить ссылку на родительские вкладки с помощью [rootParams] = "{parent : tabParent}"
, и я могу получить доступ ко всем доступным свойствам, открываемым объектом tabs. Событие, сгенерированное в шаблоне tab1.html, вызывает вызов goToTab2()
. Таким образом, мне удалось установить SelectedIndex
в 1 (что я ожидаю, чтобы изменить активную вкладку на вторую вкладку). Но вкладка не меняется.
tab1.ts
import {Page, NavParams} from 'ionic-angular';
import {Tab2} from '../tab/tab2/tab2.ts'
@Page({
templateUrl : 'build/pages/tab/tab1/tab1.html'
})
export class Tab1{
parent : any;
constructor(nav : NavParams){
this.parent = nav.data;
}
goToTab2(event, value): void{
this.parent.parent.selectedIndex = 1;
console.log(this.parent.parent);
}
}
Мне нужна помощь, что я делаю неправильно?
Ответы
Ответ 1
У меня была такая же проблема, и после нескольких часов попыток и отладки это оказалось так просто:
import {Page, NavController, Tabs} from 'ionic-angular';
@Page({
templateUrl : 'build/pages/tab/tab1/tab1.html'
})
export class Tab1{
constructor(private nav: NavController) {
};
selectTab(index: number) {
var t: Tabs = this.nav.parent;
t.select(index);
}
}
}
Ответ 2
this.nav.parent.select(tabIndex);
tabIndex начинается с 0
Ответ 3
Еще проще! Вы можете добавить атрибут selectedIndex в
<ion-tabs selectedIndex="2">
<ion-tab [root]="tab1Root"></ion-tab>
<ion-tab [root]="tab2Root"></ion-tab>
<ion-tab [root]="tab3Root"></ion-tab>
</ion-tabs>
Ответ 4
Я хотел перейти к вкладкам с боковым меню. Чтобы включить это, я сделал следующее:
Tabs.html:
<ion-tabs selectedIndex="{{activeTab}}">
<ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab>
<ion-tab [root]="tab2Root" tabTitle="Profiles" tabIcon="filing"> </ion-tab>
</ion-tabs>
Tabs.ts
...normal stuff preceding ...
export class TabsPage {
@ViewChild('page-tabs') tabRef: Tabs;
activeTab: any;
tab1Root: any = HomePage;
tab2Root: any = ProfilesPage;
constructor(public navCtrl: NavController, public params: NavParams) {
this.authUser = params.get("authUser");
this.activeTab = params.get("tab")?params.get("tab"):0;
}
}
Затем я просто передал параметр tab из app.component.ts
...normal stuff preceding ...
export class MyApp {
@ViewChild(Nav) nav: Nav;
isAppInitialized: boolean = false;
rootPage: any
pages: Array<{title: string, type: string, index?: number, component?: any}>;
constructor(
private platform: Platform,
public menu: MenuController) {
}
ngOnInit() {
this.platform.ready().then(() => {
this.pages = [
{title: 'Home', type: 'tab', index: 0},
{title: 'Profiles', type: 'tab', index:1},
{title: 'Create Shares', type: 'page', component: HomePage},
{title: 'Existing Shares',type: 'page', component: ProfilesPage}
];
});
}
openPage(page) {
this.menu.close();
if (page.type==='tab') {
this.nav.setRoot(TabsPage,{tab: page.index});
} else {
this.nav.setRoot(page.componenet);
}
}
}
Затем в app.html
<ion-header>
<ion-toolbar>
<ion-title>Left Menu</ion-title>
<button class="absolute-right" ion-button clear menuClose="left">
<span ion-text showWhen="ios">Close</span>
<ion-icon name="md-close" showWhen="android,windows"></ion-icon>
</button>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-list>
<button ion-item *ngFor="let p of pages" (click)="openPage(p)">
{{p.title}}
</button>
</ion-list>
</ion-content>
</ion-menu>
Там у вас есть...
Ответ 5
В вашем компоненте tab1 (tab1.ts) попробуйте ввести родительский компонент Tab:
export class Tab1{
constructor(@Host() _parent:Tab) {}
goToTab2(event, value): void{
this._parent.tabToShow = 1 ;
}
}
Ответ 6
Элемент tabs можно получить с помощью @ViewChild
или IonicApp.getComponent()
.
Доступ к закладке можно получить, пройдя элемент tabs.
Событие нажатия кнопки привязывается к onClick
с помощью @HostListener
.
Вы можете переключать вкладку, вызывая кнопку на кнопке на кнопке.
export class TabsPage {
tab1TabRoot: Type = Tab1Page;
tab2TabRoot: Type = Tab2Page;
tab3TabRoot: Type = Tab3Page
@ViewChild(Tabs) tabs;
constructor(
private _ngZone: NgZone,
private _platform: Platform,
private _app: IonicApp,
) {
}
ngOnInit() {
}
ngAfterViewInit() {
console.log(this.tabs);
}
public selectTab2() {
this._ngZone.run(function() {
tabs._btns._results[0].onClick();
});
}
}
Ответ 7
export class Page1 {
tab:Tabs;
// create a class variable to store the reference of the tabs
constructor(public navCtrl: NavController, private nav: Nav) {
this.tab = this.navCtrl.parent;
/*Since Tabs are declarative component of the NavController
- it is accessible from within a child component.
this.tab - actually stores an array of all the tabs defined
in the tab.html / tab component.
*/
}
goToTab2 (){
this.tab.select(1);
// the above line is self explanatory. We are just calling the select() method of the tab
}
goToTab3 (){
this.tab.select(2);
}
}
Ответ 8
Для Ionic 3+ у вас нет доступа к this.nav
, поэтому вы можете использовать такую функцию, как:
go(tabIndex: number)
{
this.app.getActiveNavs()[0].parent.select(tabIndex);
}
Если функция определена в общем классе (импортирована на все ваши страницы), вы можете вызвать ее там, где хотите:
<button ion-button (click)="core.go(0);">Go to first tab (#0)</button>
<button ion-button (click)="core.go(1);">Go to second tab (#1)</button>