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

Angular导航菜单中*ngFor循环导致下拉菜单消失的问题

Angular Material下拉菜单添加*ngFor后消失的解决方案

问题回顾

需要给导航栏的项目下拉菜单遍历项目数组,原本下拉菜单正常,但只要在导航菜单任意位置添加*ngFor循环,下拉菜单就会消失。尝试过以下操作均未解决:

  • 在顶级<li>元素添加*ngFor,下拉菜单消失
  • 用<ng-container>包裹代码并添加循环,下拉菜单同样消失
  • 在<mat-menu>内添加循环,抛出错误:Property 'menu' does not exist on type 'NavMenuComponent'
  • 给纯文本的<li>添加*ngFor,元素直接消失

解决方案

1. 先确认项目数组有效性

如果组件内的项目数组为空或未初始化,*ngFor不会渲染任何内容,视觉上就会呈现“消失”的效果。先在组件类中初始化测试数据验证:

// NavMenuComponent.ts
projects = [
  { id: 1, name: '项目A', route: '/project-user/1' },
  { id: 2, name: '项目B', route: '/project-user/2' }
];

2. 正确处理<mat-menu>模板引用变量作用域

报错的核心原因是*ngFor会改变模板变量的作用域,导致触发器无法找到对应的菜单。如果需求是单个下拉菜单展示所有项目,只需在菜单内部的菜单项上添加*ngFor,而非给外层<li>或<ng-container>加循环:

<!-- 正确的下拉菜单代码 -->
<li>
  <button mat-button [matMenuTriggerFor]="projectMenu">Project</button>
  <mat-menu #projectMenu="matMenu">
    <!-- 在菜单内部遍历项目数组生成选项 -->
    <button 
      mat-menu-item 
      class="nav-link text-dark" 
      *ngFor="let project of projects"
      [routerLink]="project.route"
    >
      {{ project.name }}
    </button>
  </mat-menu>
</li>

这里将菜单的模板引用变量设为projectMenu,确保触发器[matMenuTriggerFor]能正确绑定,同时在菜单内部循环生成项目选项。

3. 若需多导航项+各自下拉菜单的场景

如果要为每个项目生成独立的导航项和下拉菜单,需要给每个<mat-menu>生成唯一的引用变量,通过*ngFor的索引实现:

<li *ngFor="let project of projects; let i = index">
  <button mat-button [matMenuTriggerFor]="menu{{i}}">{{ project.name }}</button>
  <mat-menu #menu{{i}}="matMenu">
    <button mat-menu-item [routerLink]="['/project-detail', project.id]">详情</button>
    <button mat-menu-item [routerLink]="['/project-edit', project.id]">编辑</button>
  </mat-menu>
</li>

4. 检查组件类变量声明

确保组件类中已正确声明projects数组,无拼写错误:

// NavMenuComponent.ts
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-nav-menu',
  templateUrl: './nav-menu.component.html',
  styleUrls: ['./nav-menu.component.css']
})
export class NavMenuComponent implements OnInit {
  isExpanded = false;
  projects: any[] = [];

  ngOnInit() {
    // 可替换为从服务获取数据的逻辑
    this.projects = [
      { id: 1, name: '项目A', route: '/project-user/1' },
      { id: 2, name: '项目B', route: '/project-user/2' }
    ];
  }

  toggle() {
    this.isExpanded = !this.isExpanded;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:57:04