Ionic2更改选中子页面中的selectedIndex属性

时间:2016-07-15 21:37:31

标签: angular ionic2

我是Angular2和Ionic2的初学者。我正在尝试使用Ionic2的Tabs组件构建我自己的小应用程序。

我希望能够使用子页面中的按钮更改标签。我尝试过使用NavController.setRoot()NavController.push(),但没有一个具有所需的行为。

setRoot(Homepage)设置正确的视图,但不会更改选项卡菜单中的选定选项卡。 push(Homepage)设置正确的视图,但标签菜单不再可见。

我对如何与单页中的TabsPage(包含选项卡的@Component)进行通信感到有点困惑。

谢谢!

1 个答案:

答案 0 :(得分:4)

嗯,应该有一种更简单的方法,但我这样做了:

因为要更改活动标签,您应该从标签组件中执行此操作,我使用共享服务来处理标签内的页面之间的通信标签容器(包含标签的组件)。即使您可能可以使用Events,但我喜欢共享服务方法,因为它更容易理解,也可以在应用程序开始增长时保留。

所以基本上TabServices只创建一个Observable来允许tabs容器订阅它,并且还声明将从标签页调用的changeTabInContainerPage()方法。

import {Injectable} from '@angular/core';
import {Platform} from 'ionic-angular/index';
import {Observable} from 'rxjs/Observable';

@Injectable()
export class TabService { 

  private tabChangeObserver: any;
  public tabChange: any;

  constructor(private platform: Platform){
    this.tabChangeObserver = null;
    this.tabChange = Observable.create(observer => {
        this.tabChangeObserver = observer;
    });
  }

  public changeTabInContainerPage(index: number) {
    this.tabChangeObserver.next(index);
  }

}

然后,在每个页面(选项卡内)中,我们只添加一个按钮并将其绑定到调用服务的方法:

Page1.html

<ion-content class="has-header">
  <div padding style="text-align: center;">
    <h1>Page 1</h1>

    <button secondary (click)="changeTab()">Select next tab</button>
  </div>

</ion-content>

Page1.ts

import { Component } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { TabService } from 'tabService.ts';

@Component({
  templateUrl:"page1.html"
})
export class Page1 {

  constructor(private tabService: TabService) { }

  public changeTab() {
    this.tabService.changeTabInContainerPage(1);
  }
}

最后,在标签组件中,我们只订阅服务中的方法,然后我们使用this.tabRef.select(index);更改选定的标签

import { Component, ViewChild } from "@angular/core";
import { Page1 } from './page1.ts';
import { Page2 } from './page2.ts';
import { TabService } from 'tabService.ts'; 


@Component({
  templateUrl: 'tabs.html'
})
export class TabsPage {
  @ViewChild('myTabs') tabRef: Tabs;

  tab1Root: any = Page1;
  tab2Root: any = Page2;

  constructor(private tabService: TabService){
    this.tabService.tabChange.subscribe((index) => {
      this.tabRef.select(index);
    });
  }
}

请注意,我们通过在Tabs元素中添加#myTabs来获取ion-tabs实例的引用,我们从@ViewChild('myTabs') tabRef: Tabs;的组件中获取该引用}

<ion-tabs #myTabs>
  <ion-tab [root]="tab1Root" tabTitle="Tab 1"></ion-tab>
  <ion-tab [root]="tab2Root" tabTitle="Tab 2"></ion-tab>
</ion-tabs>