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

mat-selection-list搭配*ngFor在mat-menu中无法渲染数组数据的问题求助

问题解决:mat-menu中mat-selection-list的*ngFor无内容且报错

嘿,这个问题我之前也踩过坑!核心原因是变量名冲突导致的:

你在模板里给子菜单定义了模板引用变量<mat-menu #items="matMenu">,这个#items会优先覆盖你组件类里定义的同名items数组。当*ngFor="let item of items"执行时,它遍历的不是你预期的字符串数组,而是matMenu对象——这就是为什么会抛出NgFor only supports binding to Iterables such as Arrays的错误。

快速修复方案

只需要给模板引用变量换个不重复的名字就行:

  1. 把子菜单的#items改成#itemsMenu(或者其他你喜欢的名字)
  2. 同步修改触发子菜单的[matMenuTriggerFor]="itemsMenu"

修改后的完整代码如下:

组件代码(保持不变)

export class AppComponent implements OnInit { 
  items: string[] = ['item1', 'item2', 'item3'] 
  constructor(){} 
}

修改后的模板代码

<button [matMenuTriggerFor]="settings">打开菜单</button>
<mat-menu #settings="matMenu">
  <button mat-menu-item [matMenuTriggerFor]="itemsMenu">Items</button>
</mat-menu>
<mat-menu #itemsMenu="matMenu">
  <mat-selection-list>
    <mat-list-option *ngFor="let item of items" [value]="item"> {{item}} </mat-list-option>
  </mat-selection-list>
</mat-menu>

这样改完之后,*ngFor就能正确找到组件类里的items数组,正常渲染出所有选项了。

另外解释下为什么手动添加选项没问题:因为手动写的时候没有用到items变量,自然不会触发变量名冲突的问题,只有用*ngFor绑定items时才会暴露这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:22:50