Решением было создать компонент, который ссылался на себя рекурсивно. Код ниже:
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
- это интерфейс:
export interface NavItem {
displayName: string;
iconName?: string;
children?: NavItem[];
onClick?(): void;
}
Тогда мне просто нужно сослаться на <app-menu-item [items]="..">
в моем HTML.