You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Angular实现点击主菜单隐藏父项并显示子菜单

Angular主菜单点击替换为子菜单实现方案

问题描述

我需要在Angular应用中实现点击主菜单项时,隐藏该主菜单项并显示对应的子菜单。例如点击Agences后,Agences区域消失,替换为子菜单Portefeuilles,目前现有代码无法实现该效果,求指导。

现有代码

online.ts

export class OnlineComponent implements OnInit {
  nav: IMenuItem[] = [];

  constructor(private onlineService: OnlineService) { }

  ngOnInit() {
    // Initialize the 'nav' property with data from the 'onlineService'
    this.nav = this.onlineService.IMenuItem;
  }

  toggleSubMenu(index: number) {
    // Toggle the active state of the clicked item
    this.nav[index].active = !this.nav[index].active;

    // Ensure that all other items are deactivated
    for (let i = 0; i < this.nav.length; i++) {
      if (i !== index) {
        this.nav[i].active = false;
      }
    }
  }
}

online.html

<div class="container text-center" *ngIf="nav">
    <div class="sideBar">
      <div class="menu-content">
        <ul class="menu-items">
          <li class="item" *ngFor="let menuItem of nav; let i = index">
            <div class="menu-item" (click)="toggleSubMenu(i)">
              <!-- Display the menu item name -->
              <span class="title">{{ menuItem.name }}</span>
            </div>
            <ul class="submenu" *ngIf="menuItem.active">
              <li class="subitem" *ngFor="let subItem of menuItem.sub">
                <div class="submenu-item">
                  <!-- Add [routerLink] directive to manage navigation -->
                  <a [routerLink]="subItem.state">{{ subItem.name }}</a>
                </div>
              </li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
  </div>
  
  <div class="container">
    <!-- This is where the routed components will be displayed -->
    <router-outlet></router-outlet>
  </div>

解决方案

核心思路是通过menuItem.active状态控制主菜单项的显示/隐藏,当菜单项被激活(点击后),隐藏主标题,只显示子菜单。

修改online.html模板

给主菜单的div元素添加*ngIf="!menuItem.active"条件,这样激活状态下主标题会自动隐藏:

<div class="container text-center" *ngIf="nav">
    <div class="sideBar">
      <div class="menu-content">
        <ul class="menu-items">
          <li class="item" *ngFor="let menuItem of nav; let i = index">
            <!-- 仅当菜单未激活时显示主标题 -->
            <div class="menu-item" (click)="toggleSubMenu(i)" *ngIf="!menuItem.active">
              <span class="title">{{ menuItem.name }}</span>
            </div>
            <ul class="submenu" *ngIf="menuItem.active">
              <li class="subitem" *ngFor="let subItem of menuItem.sub">
                <div class="submenu-item">
                  <a [routerLink]="subItem.state">{{ subItem.name }}</a>
                </div>
              </li>
              <!-- 可选:添加返回按钮,点击回到主菜单 -->
              <li class="subitem" (click)="toggleSubMenu(i)">
                <div class="submenu-item">← 返回主菜单</div>
              </li>
            </ul>
          </li>
        </ul>
      </div>
    </div>
  </div>
  
  <div class="container">
    <router-outlet></router-outlet>
  </div>

逻辑层说明

现有toggleSubMenu方法已经实现了单菜单项激活的逻辑(点击某一项时,其他项自动取消激活),无需额外修改。添加返回按钮后,点击返回会触发同样的toggleSubMenu方法,将当前菜单项的active状态设为false,从而重新显示主标题、隐藏子菜单。

内容的提问来源于stack exchange,提问作者juliette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 07:33:13