【问题标题】:Ionic2: How to use an different ion-menu in each child viewIonic2:如何在每个子视图中使用不同的离子菜单
【发布时间】:2018-09-01 16:22:38
【问题描述】:

我正在尝试学习 Ionic2 侧边菜单的使用,并希望看看是否可以在每个子视图中拥有单独的侧边菜单。

我已经安装了一个入门应用程序,它在主应用程序中有一个 ion-menu,即在我们拥有的引导程序 app.html 文件中

<ion-menu [content]="content">

 <ion-toolbar>
   <ion-title>Pages</ion-title>
 </ion-toolbar>

 <ion-content>
   <ion-list>
     <button menuClose ion-item *ngFor="let p of pages" (click)="openPage(p)">
       {{p.title}}
     </button>
   </ion-list>
  </ion-content>

</ion-menu>

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

然后我添加了我自己的页面,并在示例应用程序的初始根页面getting-started.ts 添加以下内容以导航到我的新页面..

public goToSideMenuPage(): void{    
   this._navController.push(SideMenuPage);

我还添加了一个按钮来调用上述处理程序。

在 SideMenuPage 中,我希望它有自己完全不同的侧菜单。我已经尝试了以下...

<ion-menu [content]="thecontent">
<ion-toolbar>
  <ion-title>Menu title</ion-title>
</ion-toolbar>

<ion-content>
 <ion-list>
    <button>button1</button>
    <button>button2</button>
 </ion-list>
 </ion-content>
</ion-menu>

<ion-content #thecontent>
  <div>Main contents text</div>
 </ion-content>

但是,当我转到我的页面时,我看到的只是左上角的Main contents text。我没有看到菜单汉堡图标,如果我向右拖动,我会看到 app.html 中设置的应用程序主菜单,而不是我自己的“本地”菜单,其内容为

<button>button1</button>
<button>button2</button>

在找到here 的doco 中,该演示确实显示了在运行时交换的侧边菜单,但我在任何地方都看不到它的实际代码。这与我想要做的很接近(尽管我希望它在取决于我导航到的子页面时交换),所以看起来确实可以做到,但我只是不太明白我应该怎么做正在做。

有谁知道这是否可行,如果可以,该怎么做?

【问题讨论】:

    标签: angular typescript ionic-framework ionic2 ionic3


    【解决方案1】:

    您要查找的信息位于 Ionic2 文档的 MenuController 部分。这可以通过在app.html 中添加菜单来完成,但为它们分配一个像这样的 id:

    <ion-menu [content]="content" side="left" id="menu1">
      <ion-toolbar secondary>
        <ion-title>Menu 1</ion-title>
      </ion-toolbar>
      <ion-content>
        <ion-list>
          <button ion-item menuClose="menu1" detail-none>
            Close Menu 1
          </button>
        </ion-list>
      </ion-content>
    </ion-menu>
    
    <ion-menu [content]="content" side="right" id="menu2">
      <ion-toolbar danger>
        <ion-title>Menu 2</ion-title>
      </ion-toolbar>
      <ion-content>
        <ion-list>
          <button ion-item menuClose="menu2" detail-none>
            Close Menu 2
          </button>
        </ion-list>
      </ion-content>
    </ion-menu>
    
    <ion-nav [root]="rootPage" #content></ion-nav>
    

    然后,在每个页面中,我们可以像这样决定应该激活哪个菜单:

      constructor(private menu: MenuController, private nav: NavController) { }
    
      ionViewDidEnter() {
        // Use the id to enable/disable the menus
        this.menu.enable(true, 'menu1');
        this.menu.enable(false, 'menu2');
      }
    

    另外,请注意,我使用this.nav.setRoot(Page1); 来显示第二页,而不是使用this.nav.push(Page1); 之类的东西。


    编辑:如果您希望同时激活两个菜单,请查看this answer


    编辑 2:就像 @peterc 在 cmets 中所说:

    如果我的页面中有侧边菜单,我发现这也有效 sidemenu-page.html 并设置 this.menu.enable(true, 'menu1');在它的 组件(所以可以选择让侧边菜单带有 将切换到该页面的标记)。

    我将其添加到答案中,因为将要使用它的视图似乎是放置菜单而不是 app.html 的更好位置。

    【讨论】:

    • 非常感谢!这就是我所追求的。这里的两个键使用 setRoot,也使用 MenuController.enable。我发现如果我在我的页面 sidemenu-page.html 中有我的侧边菜单并在它的组件中设置 this.menu.enable(true, 'menu1'); 这也有效(因此可以选择让带有页面标记的侧边菜单切换到它。
    • 很高兴我能帮上忙 :) 如果您觉得可以,我会将您的评论添加到答案中,以便其他用户可以轻松找到该信息...
    • 是的,当然可以在其中添加任何内容,以便其他人将所有内容都放在一个地方..
    • @peterc 你能举个例子吗,因为我收到这个错误:Property 'content' does not exist on type 'MyPage'
    • @user623396 我将把当时的代码放在下面的答案中(这样我可以稍微格式化一下)。这是针对较旧的 beta Ionic 版本,但希望仍然正确(或至少接近)。我使用的示例项目前一段时间坏了,我放弃了它
    【解决方案2】:

    为了@user623396,将其添加为@sebaferreras 提供的信息的一部分

    要在实际视图中显示侧边菜单,我有以下...

        <ion-menu [content]="thecontent" id='menu1'>
          <ion-toolbar>
            <ion-title>Title</ion-title>
          </ion-toolbar>
    
          <ion-content>
            <ion-list>
              <button>button1</button>
              <button>button2</button>      
            </ion-list>
          </ion-content>
        </ion-menu>
    
        <ion-navbar *navbar>
          <button menuToggle>
            <ion-icon name="menu"></ion-icon>
          </button>
          <ion-title>Getting Started</ion-title>
        </ion-navbar>
    
        <ion-content #thecontent>
          <div>Some text</div>  
        </ion-content>
    

    然后在组件文件中

        import {Component} from '@angular/core';
        import {MenuController, NavController} from 'ionic-angular';
    
        // Use the pipe TranslatePipe to use in the markup
        @Component({
          templateUrl: 'build/pages/sidemenu-page/sidemenu-page.html'
        })
        export class SideMenuPage {
          public rootPage = SideMenuPage;
    
          public myVal: string;  
    
          constructor(private menu: MenuController, private nav: NavController, private tranlate: TranslateService){
          }
    
          ionViewDidEnter() {
            this.menu.enable(true, 'menu1');
          }  
        }
    

    希望这对于最新版本的 Ionic 仍然是正确的(我已经有一段时间没有查看这个示例了)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多