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

Angular新@for循环在NzDropdown中报错,*ngFor可正常运行

问题原因与解决方案:Ng-Zorro下拉菜单@for循环报错

问题根源

你在模板里给<nz-dropdown-menu>定义了模板引用变量#menu="nzDropdownMenu",这和组件类里的@Input() menu: string[]重名了。在Angular的模板作用域中,模板引用变量的优先级高于组件类的属性,所以@for (item of menu; track $index)里的menu指向的是NzDropdownMenuComponent实例,而非你传入的字符串数组——这就是报错的核心原因:组件实例没有迭代器(Symbol.iterator),无法被循环遍历。

至于旧的*ngFor能正常运行,是因为Angular对两种循环语法的作用域解析逻辑存在差异,属于偶然能工作的场景,绝对不能依赖这种行为。

解决方案

方案1:修改模板引用变量名(推荐)

把模板里的#menu改成其他名称,避免和输入属性重名:

<nz-dropdown-menu #dropdownMenu="nzDropdownMenu">
  <ul nz-menu>
    @for (item of menu; track $index) {
      <li nz-menu-item (click)="menuItemclicked(item)">
        {{ item }}
      </li>
    }
  </ul>
</nz-dropdown-menu>

方案2:修改输入属性名

如果不想改模板变量,也可以调整组件的输入属性名称,比如改成menuItems:
组件类代码:

@Input() public menuItems: string[] = []

模板代码:

<nz-dropdown-menu #menu="nzDropdownMenu">
  <ul nz-menu>
    @for (item of menuItems; track $index) {
      <li nz-menu-item (click)="menuItemclicked(item)">
        {{ item }}
      </li>
    }
  </ul>
</nz-dropdown-menu>

两种方案都能彻底解决问题,优先选方案1,因为不会改变组件对外的输入接口,更符合代码的兼容性要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:01:01