我有
<mat-menu #saveMenu="matMenu">...</mat-menu>
在app-save-document companent和
中<app-save-document></app-save-document>
<button mat-icon-button [matMenuTriggerFor]="saveMenu">
在另一个组成部分。
如果我在不同的组件中有[matMenuTriggerFor]的mat-menu和按钮,我可以做些什么来让按钮看到菜单吗?
现在我有ERROR Error: mat-menu-trigger: must pass in an mat-menu instance.
答案 0 :(得分:12)
好吧,如果你想做这样的事情:
<button mat-button [matMenuTriggerFor]="menu">Menu</button>
<other-component [matMenu]="menu"></other-component>
<mat-menu #menu="matMenu">
<button mat-menu-item>Item 1</button>
<button mat-menu-item>Item 2</button>
</mat-menu>
您可以像这样编码<other-component>
:
import {Component,Input} from '@angular/core';
import {MatMenu} from '@angular/material';
@Component({
selector: 'other-component',
template: `
This button is in another component:
<button [matMenuTriggerFor]="matMenu">Click here to open menu</button>
`,
})
export class OtherComponent {
@Input() matMenu: MatMenu;
}
你可以在stackblitz中看到它:https://stackblitz.com/edit/angular-xkfdns
<小时/>
另一种方法是(我认为这就是你想要的):你的触发按钮在父母中是(但在孩子之外)并且菜单本身在子组件中定义为。
父组件:
<button mat-button [matMenuTriggerFor]="childComponentMenu?.menu">
Menu in other component
</button>
<child-component></child-component>
export class ParentComponent {
@ViewChild(ChildComponent) childComponentMenu: ChildComponent;
}
子组件:
@Component({
selector: 'child-component',
template: `
<mat-menu>
<button mat-menu-item>Item 1 (inside other component)</button>
<button mat-menu-item>Item 2 (inside other component)</button>
</mat-menu>
`,
})
export class ChildComponent {
@ViewChild(MatMenu) menu: MatMenu;
}
<小时/>
另一种方法,类似于上面的方法,但使用模板引用变量(注意子组件装饰器中的exportAs
):
父组件:
<button mat-button [matMenuTriggerFor]="x.menu">
Menu in other component
</button>
<child-component #x="menuInOtherComponent"></child-component>
export class ParentComponent {
}
子组件:
@Component({
selector: 'child-component',
template: `
<mat-menu>
<button mat-menu-item>Item 1 (inside other component)</button>
<button mat-menu-item>Item 2 (inside other component)</button>
</mat-menu>
`,
exportAs: 'menuInOtherComponent',
})
export class ChildComponent {
@ViewChild(MatMenu) menu: MatMenu;
}
Stackblitz:https://stackblitz.com/edit/angular-xkfdns-92t9sn
答案 1 :(得分:1)
这是使用ng-content
的另一种解决方案。那是我首选的方式。
my-custom-menu-component html:
<div [matMenuTriggerFor]="menu">
<ng-content></ng-content>
</div>
<mat-menu #menu="matMenu">
menu content
</mat-menu>
父组件html:
<my-custom-menu-component>
<button>click me</button>
<my-custom-menu-component>