在Ionic 4

时间:2019-05-03 15:18:35

标签: angular-ui-router ionic4 side-menu

我想使用Ionic 4来构建一个简单地以下列方式工作的应用程序:

  • 在登机页面上显示了一些图像/文字
  • 用户单击“开始”按钮后,某些标志 onboarded = true 被写入本地存储
  • 用户重定向到主应用程序视图,该视图是包含侧面菜单布局的 ion-split-pane (离子分割窗格)
  • 下次用户启动应用程序时,我检查他/她是否已经查看了登录屏幕(通过检查存储中是否存在 onboarded var),并且是否存在-我会立即重定向用户到我提到过的具有侧面菜单布局的主应用程序,省略了登机屏幕。

我使用离子cli启动了该项目,它基于侧面菜单模板,并且为了实现上述逻辑,我通过以下方式对其进行了修改:

app.component.ts

import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { Storage } from '@ionic/storage';
import { Router } from '@angular/router';

@Component({
  selector: 'app-root',
  template: '<router-outlet></router-outlet>',
})
export class AppComponent {

  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private storage: Storage,
    private router: Router
  ) {
    this.initializeApp();
  }

  async initializeApp() {

    await this.platform.ready();

    this.statusBar.styleDefault();

    this.splashScreen.hide();

    const onboarded = await this.storage.get('onboarded');

    if (onboarded) {

      this.router.navigate(['main-app']);

    } else {

      this.router.navigate(['onboarding']);
    }
  }
}

onboarding.page.html

<ion-header>
  <ion-toolbar>
    <ion-title>onboarding</ion-title>
  </ion-toolbar>
</ion-header>

<ion-content>
Welcome aboard!
<ion-button (click)="start()">Start app!</ion-button>
</ion-content>

onboarding.page.ts

import { Component } from '@angular/core';
import { Storage } from '@ionic/storage';
import { Router } from '@angular/router';

@Component({
  selector: 'app-onboarding',
  templateUrl: './onboarding.page.html',
  styleUrls: ['./onboarding.page.scss'],
})
export class OnboardingPage {

  constructor(
    private storage: Storage,
    private router: Router
  ) { }

  start() {

    this.storage.set('onboarded', true);

    this.router.navigate(['main-app']);
  }
}

main-app.page.html

<ion-app>
  <ion-split-pane>
    <ion-menu>
      <ion-header>
        <ion-toolbar>
          <ion-title>Menu</ion-title>
        </ion-toolbar>
      </ion-header>
      <ion-content>
        <ion-list>
          <ion-menu-toggle auto-hide="false" *ngFor="let p of appPages">
            <ion-item [routerDirection]="'root'" [routerLink]="[p.url]">
              <ion-icon slot="start" [name]="p.icon"></ion-icon>
              <ion-label>
                {{p.title}}
              </ion-label>
            </ion-item>
          </ion-menu-toggle>
        </ion-list>
      </ion-content>
    </ion-menu>
    <ion-router-outlet main></ion-router-outlet>
  </ion-split-pane>
</ion-app>

main-app.page.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-main-app',
  templateUrl: './main-app.page.html',
  styleUrls: ['./main-app.page.scss'],
})
export class MainAppPage {

  public appPages = [
    {
      title: 'Home',
      url: '/home',
      icon: 'home'
    },
    {
      title: 'List',
      url: '/list',
      icon: 'list'
    }
  ];

  constructor() { }

}

列表和主页只是空白页面,其内容对于此示例并不重要 问题是包含侧边菜单和内容的主应用程序无法正常工作。我知道<ion-router-outlet main></ion-router-outlet>的使用存在问题,但是找不到正确的解决方案。 有谁知道如何使它工作?

谢谢! 安德鲁。

1 个答案:

答案 0 :(得分:0)

尝试将contentId="content"添加到您的<ion-menu>

即:<ion-menu contentId="content">

,还将id="content"添加到您的<ion-router-outlet>

即:<ion-router-outlet id="content" main>

我似乎还记得有关路由器插座的一些信息,否则无法正常工作。