我最近将我的 Ionic 2 项目更新到了版本 3。除了深度链接部分之外,一切都按预期工作。
我使用 Ionic 提供的拆分窗格,因此我有一个拆分窗格服务,它管理导航堆栈。在主控制器中,我订阅了此服务,并相应地调用我的视图子的 setRoot() 或 push():
this.rootSubjectSubscription = this.splitPaneService.rootSubject$.subscribe((pageWithContext: PageWithContext) => {
console.info(`Displaying ${JSON.stringify(pageWithContext)} with setRoot`);
console.info('tester:', pageWithContext.page.name);
this.contentCtrl.setRoot(pageWithContext.page, pageWithContext.data);
});
this.pushSubjectSubscription = this.splitPaneService.pushSubject$.subscribe((pageWithContext: PageWithContext) => {
console.info(`Displaying ${JSON.stringify(pageWithContext)} with Push`);
this.contentCtrl.push(pageWithContext.page, pageWithContext.data);
});
当我导航到根应用程序页面 ( http://localhost:9999 ) 时,没有问题。
但是,当我直接导航到主页链接(http://localhost:9999/#/nav/n4/home)时,主页控制器会加载两次。这会生成两个订阅,并且会因为 setRoot 被调用两次而产生错误。
我认为这是因为在我的 app.component.ts 中,我有以下代码:
import { Component } from '@angular/core';
import { Platform } from 'ionic-angular';
import { StatusBar } from '@ionic-native/status-bar';
import { SplashScreen } from '@ionic-native/splash-screen';
import { AuthService } from '../providers/auth-service';
@Component({
templateUrl: 'app.html'
})
export class Switchboard {
rootPage: any;
constructor(platform: Platform, statusBar: StatusBar, splashScreen: SplashScreen, private _auth: AuthService) {
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.
statusBar.styleDefault();
splashScreen.hide();
});
const authObserver = _auth.subscribe((state) => {
console.info(this.rootPage);
if (state) {
this.rootPage = 'home';
} else {
this.rootPage = 'auth';
}
});
}
}
在 auth 观察者中,如果用户登录(这是预期行为),我会导航到主页。某种方式,当我直接导航到主页时,这个控制器被加载了两次(由深度链接提供者和身份验证观察者)。
有什么办法可以规避这种情况吗?