1

我最近将我的 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 观察者中,如果用户登录(这是预期行为),我会导航到主页。某种方式,当我直接导航到主页时,这个控制器被加载了两次(由深度链接提供者和身份验证观察者)。

有什么办法可以规避这种情况吗?

4

0 回答 0