我正在使用Ionic侧面菜单应用程序。 上图突出显示了我的问题。我希望在导航到该特定页面时更改菜单的活动状态。 单击菜单项进行导航,而不单击其他任何地方进行导航时,菜单状态工作正常。
从首页单击“转到列表”时,我正在主页中使用以下代码。
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
import { ListPage } from '../list/list';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
listPage = ListPage;
constructor(public navCtrl: NavController) {
}
goToList(){
this.navCtrl.setRoot(this.listPage);
}
}
app.component.ts
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { HomePage } from '../pages/home/home';
import { ListPage } from '../pages/list/list';
import { GalleryPage } from '../pages/gallery/gallery';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
@ViewChild(Nav) nav: Nav;
rootPage: any = HomePage;
activePage: any;
pages: Array<{title: string, component: any}>;
constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen) {
this.initializeApp();
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: HomePage },
{ title: 'List', component: ListPage },
{ title: 'Gallery', component: GalleryPage}
];
this.activePage = this.pages[0];
}
initializeApp() {
this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.statusBar.styleDefault();
this.splashScreen.hide();
});
}
openPage(page) {
// Reset the content nav to have just this page
// we wouldn't want the back button to show in this scenario
this.nav.setRoot(page.component);
this.activePage = page;
}
checkActive(page){
return page === this.activePage;
}
}
对此有任何帮助吗?
答案 0 :(得分:0)
我能够自己找到答案,然后将其发布给其他人以后参考。
在 ngAfterViewInit()中添加了代码,它似乎可以正常工作。
每次页面状态更改时,都会调用ngAfterViewInit(),并且 view.instance.constructor.name 会为您提供当前页面的构造函数名称,您可以简单地对其进行比较与菜单数组一起找出要导航到的页面,只需将其设置为活动页面即可。
请参阅下面的完整代码
import { Component, ViewChild } from '@angular/core';
import { Nav, Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { HomePage } from '../pages/home/home';
import { ListPage } from '../pages/list/list';
import { GalleryPage } from '../pages/gallery/gallery';
@Component({
templateUrl: 'app.html'
})
export class MyApp {
@ViewChild(Nav) nav: Nav;
rootPage: any = HomePage;
activePage: any;
pages: Array<{title: string, component: any, active: boolean}>;
constructor(public platform: Platform, public statusBar: StatusBar, public splashScreen: SplashScreen) {
this.initializeApp();
// used for an example of ngFor and navigation
this.pages = [
{ title: 'Home', component: HomePage, active: false },
{ title: 'List', component: ListPage, active: false },
{ title: 'Gallery', component: GalleryPage, active: false}
];
this.activePage = this.pages[0];
}
ngAfterViewInit(){
this.nav.viewDidEnter.subscribe((view) => {
for(let i = 0 ; i < this.pages.length ; i++){
if(this.pages[i].component.name == view.instance.constructor.name){
this.activePage = this.pages[i];
break;
}
}
});
}
initializeApp() {
this.platform.ready().then(() => {
// Okay, so the platform is ready and our plugins are available.
// Here you can do any higher level native things you might need.
this.statusBar.styleDefault();
this.splashScreen.hide();
});
}
openPage(page) {
// Reset the content nav to have just this page
// we wouldn't want the back button to show in this scenario
this.nav.setRoot(page.component);
this.activePage = page;
}
checkActive(page){
// console.log(page.title, this.activePage.title, page === this.activePage);
return page === this.activePage;
}
}