禁用登录页面ionic 4上的菜单

时间:2018-07-31 09:30:57

标签: ionic-framework angular6 ionic4

我第一次使用离子4的beta。 我尝试禁用登录页面上的菜单,但遇到了一些麻烦。

我已经使用ionic-cli和sidemenu模板创建了该应用程序,然后生成了一个登录页面。

我从app.component.html中删除了<ion-split-pane>

我修改了app-routing.module.ts以重定向到我的登录屏幕。 在我的登录文件中,我尝试放置ngOnInit事件以禁用此特定页面上的菜单

import { Component, OnInit, AfterContentInit, AfterViewInit,OnDestroy } from '@angular/core';
import { MenuController } from '@ionic/angular';
@Component({
  selector: 'app-login',
  templateUrl: './login.page.html',
  styleUrls: ['./login.page.scss'],
})
export class LoginPage implements OnInit, AfterContentInit, AfterViewInit,OnDestroy {
  constructor(public menuCtrl: MenuController) {}
  ngOnInit() {
    this.menuCtrl.enable(false);
    this.menuCtrl.swipeEnable(false);
  }
  ngAfterContentInit()  {
    this.menuCtrl.enable(false);
    this.menuCtrl.swipeEnable(false);
  }
  ngAfterViewInit() {
    this.menuCtrl.enable(false);
    this.menuCtrl.swipeEnable(false);
  }
  ngOnDestroy() {
    this.menuCtrl.enable(true);
    this.menuCtrl.swipeEnable(true);
  }
}

我还尝试了在离子菜单中设置的ID

<ion-menu swipeEnabled="true" #menu>

并使用

更改我的代码
this.menuCtrl.enable(false, 'menu');

它不起作用,请有人帮我。

谢谢

8 个答案:

答案 0 :(得分:11)

Ionic 4.0.0 仍支持ionViewWillEnter,请使用以下代码:

ionViewWillEnter() {
  this.menuCtrl.enable(false);
}

您可以找到完整的示例here

答案 1 :(得分:2)

Ionic 4,您将使用ion-menu上的disabled属性在登录时隐藏。

<ion-menu [disabled]="!isLoggedIn"></ion-menu>

答案 2 :(得分:1)

对于ionic 4应用程序,我在welcome.page.ts文件中执行了以下操作。 welcome.page.ts是我要在其中隐藏拆分窗格的页面。

import {  MenuController } from '@ionic/angular';

constructor( public menuCtrl: MenuController){}

ionViewWillEnter() {
 this.menuCtrl.enable(false);
}

答案 3 :(得分:0)

我认为您应该禁用离子菜单中的滑动,而不是手动禁用它:

<ion-menu [content]="content" [swipeEnabled]="false">
   Your code
</ion-menu>
<ion-nav [root]="rootPage" #content swipeBackEnabled="false"></ion-nav>

并在登录页面

<ion-header>

 <ion-navbar>
   <ion-title text-center>Login</ion-title>
 </ion-navbar>

</ion-header>

这种方式的菜单将在登录页面中被禁用。

答案 4 :(得分:0)

使用解决了我的问题

<ion-menu [swipeGesture]="false" ...>

答案 5 :(得分:0)

这是正确的方法

constructor(public menu: MenuController) {
    this.menu.swipeGesture(false)
}

答案 6 :(得分:0)

以上答案均不适合我。

我做了一个测试,以检查方法的执行顺序,这就是我得到的:

1.initializeApp

2.ngOnInit

2.1平台就绪

image app.component.ts

示例控制台输出,来自 initializeApp image output initializeApp

中的 platfor ready

ionViewDidEnter内部的console.log('ionViewDidEnter')从未被控制台显示

在上述情况显而易见的情况下,请尝试以下情形

对不起,我的英语

app.component.ts

import { Component, OnInit } from '@angular/core';
import { Platform, MenuController } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';

@Component({
  selector: 'app-root',
  templateUrl: 'app.component.html',
  styleUrls: ['app.component.scss']
})
export class AppComponent implements OnInit {
  public selectedIndex = 0;
  public appPages = [
    {
      title: 'Inbox',
      url: '/folder/Inbox',
      icon: 'mail'
    },
    {
      title: 'Outbox',
      url: '/folder/Outbox',
      icon: 'paper-plane'
    },
    {
      title: 'Favorites',
      url: '/folder/Favorites',
      icon: 'heart'
    },
    {
      title: 'Archived',
      url: '/folder/Archived',
      icon: 'archive'
    },
    {
      title: 'Trash',
      url: '/folder/Trash',
      icon: 'trash'
    },
    {
      title: 'Spam',
      url: '/folder/Spam',
      icon: 'warning'
    }
  ];
  public labels = ['Family', 'Friends', 'Notes', 'Work', 'Travel', 'Reminders'];

  constructor(
    private platform: Platform,
    private splashScreen: SplashScreen,
    private statusBar: StatusBar,
    private menu: MenuController
  ) {
    this.initializeApp();
  }

  initializeApp() {
    console.log('initializeApp');
    
    return this.platform.ready().then(() => {
      console.log('platform ready')
      this.statusBar.styleDefault()
      this.splashScreen.hide()
      // // -------------------------------------------------// 
      // this.menu.enable(false, "custom")                   //
      // this.menu.isEnabled('custom').then((enable)=>{      // => yes working
      //   console.log('enable from platform ready', enable);//
      // });                                                 //
      // //--------------------------------------------------//
    });
  }

  ngOnInit() {
    console.log('ngOnInit');
    //  // ---------------------------------------------// 
    //  this.menu.enable(false, "custom")               //
    //  this.menu.isEnabled('custom').then((enable)=>{  // => yes working
    //    console.log('enable from ngOnInit', enable);  //
    //  });                                             //
    //  //----------------------------------------------//
    const path = window.location.pathname.split('folder/')[1];
    if (path !== undefined) {
      this.selectedIndex = this.appPages.findIndex(page => page.title.toLowerCase() === path.toLowerCase());
    }
  }
  ionViewDidEnter(){
    console.log('ionViewDidEnter')
    //  // ---------------------------------------------// 
    //  this.menu.enable(false, "custom")               //
    //  this.menu.isEnabled('custom').then((enable)=>{  // => not working
    //    console.log('enable ionViewDidEnter', enable);//
    //  });                                             //
    //  //----------------------------------------------//
  }

}

app.component.html

<ion-app>
  <ion-split-pane contentId="main-content">
    <ion-menu contentId="main-content" type="overlay" menuId="custom" id="custom">
      <ion-content>
        <ion-list id="inbox-list">
          <ion-list-header>Inbox</ion-list-header>
          <ion-note>hi@ionicframework.com</ion-note>

          <ion-menu-toggle auto-hide="false" *ngFor="let p of appPages; let i = index">
            <ion-item (click)="selectedIndex = i" routerDirection="root" [routerLink]="[p.url]" lines="none" detail="false" [class.selected]="selectedIndex == i">
              <ion-icon slot="start" [ios]="p.icon + '-outline'" [md]="p.icon + '-sharp'"></ion-icon>
              <ion-label>{{ p.title }}</ion-label>
            </ion-item>
          </ion-menu-toggle>
        </ion-list>

        <ion-list id="labels-list">
          <ion-list-header>Labels</ion-list-header>

          <ion-item *ngFor="let label of labels" lines="none">
            <ion-icon slot="start" ios="bookmark-outline" md="bookmark-sharp"></ion-icon>
            <ion-label>{{ label }}</ion-label>
          </ion-item>
        </ion-list>
      </ion-content>
    </ion-menu>
    <ion-router-outlet id="main-content"></ion-router-outlet>
  </ion-split-pane>
</ion-app>

答案 7 :(得分:0)

完整的解决方案将首先使用下面的代码 ionViewWillEnter(意思是当它进入登录页面时您需要禁用侧边菜单)

  ionViewWillEnter() {
    this.menuCtrl.enable(false);
  }

然后当你离开侧边菜单时你需要重新启用它,否则它会在整个应用程序中禁用它

注意:不要忘记在构造函数上调用 public menuCtrl: MenuController

  ionViewDidLeave() {
    // enable the root left menu when leaving the tutorial page
    this.menuCtrl.enable(true);
  }