垫菜单和按钮在不同的组件

tat*_*tol 4 angular-cli angular-material2

我有

<mat-menu #saveMenu="matMenu">...</mat-menu>
Run Code Online (Sandbox Code Playgroud)

在app-save-document companent和

<app-save-document></app-save-document>
<button mat-icon-button [matMenuTriggerFor]="saveMenu">
Run Code Online (Sandbox Code Playgroud)

在另一个companent.

如果我在不同的组件中有[matMenuTriggerFor]的mat-menu和按钮,我可以做些什么来让按钮看到菜单吗?

我现在有 ERROR Error: mat-menu-trigger: must pass in an mat-menu instance.

jpa*_*vel 19

好吧,如果你想做这样的事情:

<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>
Run Code Online (Sandbox Code Playgroud)

你可以<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;
}
Run Code Online (Sandbox Code Playgroud)

您可以在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;
}
Run Code Online (Sandbox Code Playgroud)

子组件:

@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;
}
Run Code Online (Sandbox Code Playgroud)


还有另一种方法

另一种方法,类似于上面的方法,但使用模板引用变量(注意exportAs子组件的装饰器中):

父组件:

<button mat-button [matMenuTriggerFor]="x.menu">
    Menu in other component
</button>
<child-component #x="menuInOtherComponent"></child-component>

export class ParentComponent {
}
Run Code Online (Sandbox Code Playgroud)

子组件:

@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;
}
Run Code Online (Sandbox Code Playgroud)

Stackblitz:https://stackblitz.com/edit/angular-xkfdns-92t9sn

  • 谢谢你,就像它说的,第三个是完美的。我第一次遇到 exportAs 属性! (2认同)
  • 您不需要为第三个设置“ exportAs”。只需使用`[matMenuTriggerFor] =“ x.menu”`和`&lt;child-component #x&gt;` (2认同)

Ben*_*n M 5

这是使用ng-content. 这是我首选的方式。

我的自定义菜单组件 html:

<div [matMenuTriggerFor]="menu">
  <ng-content></ng-content>
</div>

<mat-menu #menu="matMenu">
  menu content
</mat-menu>
Run Code Online (Sandbox Code Playgroud)

父组件 html:

<my-custom-menu-component>
  <button>click me</button>
<my-custom-menu-component>
Run Code Online (Sandbox Code Playgroud)