gpt4 book ai didi

Angular matMenuTriggerFor 以编程方式

转载 作者:太空狗 更新时间:2023-10-29 17:26:54 29 4
gpt4 key购买 nike

我在 Angular 项目中使用 matMenu,它是从数组动态填充的。该菜单可以有一级子菜单。我的菜单定义数组如下所示:

{
text: string,
subMenuName: string,
subMenuItems: [{
text: string,
onClick(): void
}]
}

我正尝试按如下方式在 HTML 中构建此菜单:

<mat-menu #menu="matMenu">
<button *ngFor="let item of menuItems" [matMenuTriggerFor]="menuItem.subMenuName" mat-menu-item>
{{ item.text }}
</button>
</mat-menu>

<ng-container *ngFor="item of menuItems">
<mat-menu #item.subMenuName="matMenu">
<button *ngFor="let subItem of item.subMenuItems (click)="subItem.onClick();">
{{ subItem.text }}
</button>
</mat-menu>
</ng-container>

当我尝试运行它时,它不符合要求并且出现以下错误:

ERROR TypeError: Cannot read property 'subscribe' of undefined
at MatMenuTrigger.push../node_modules/@angular/material/esm5/menu.es5.js.MatMenuTrigger.ngAfterContentInit

最佳答案

解决方案是创建一个递归引用自身的组件。代码如下:

TS

import { Component, Input, ViewChild } from '@angular/core';
import { NavItem } from './nav-item/nav-item';

@Component({
selector: 'app-menu-item',
templateUrl: './menu-item.component.html',
styleUrls: ['./menu-item.component.css']
})
export class MenuItemComponent {
@Input('items')
public items: NavItem[];

@ViewChild('childMenu')
public childMenu;

constructor() { }

}

HTML

<mat-menu #childMenu="matMenu" [overlapTrigger]="false">
<span *ngFor="let child of items">
<span *ngIf="child.children && child.children.length > 0">
<button mat-menu-item color="primary" [matMenuTriggerFor]="menu.childMenu">
<mat-icon>{{ child.iconName }}</mat-icon>
<span>{{ child.displayName }}</span>
</button>
<app-menu-item #menu [items]="child.children"></app-menu-item>
</span>
<span *ngIf="!child.children || child.children.length === 0">
<button mat-menu-item (click)="child.onClick();">
<mat-icon>{{ child.iconName }}</mat-icon>
<span>{{ child.displayName }}</span>
</button>
</span>
</span>
</mat-menu>

在哪里NavItem是一个接口(interface):

export interface NavItem {
displayName: string;
iconName?: string;
children?: NavItem[];

onClick?(): void;
}

然后我只需要引用 <app-menu-item [items]="..">在我的 HTML 中。

关于Angular matMenuTriggerFor 以编程方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393885/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com