不同组件中的垫子菜单和按钮

Posted

技术标签:

【中文标题】不同组件中的垫子菜单和按钮【英文标题】:mat-menu and button in different components 【发布时间】:2018-06-28 19:28:46 【问题描述】:

我有

<mat-menu #saveMenu="matMenu">...</mat-menu>

在 app-save-document 组件中和

<app-save-document></app-save-document>
<button mat-icon-button [matMenuTriggerFor]="saveMenu">

在另一个组件中。

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

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

【问题讨论】:

【参考方案1】:

我使用的是@julianobrasil 的第二种方法,但就我而言,我的要求是在单击菜单组件(子组件)中的十字图标时关闭对话框。 所以,用了这个方法...

<button [matMenuTriggerFor]="menu" [matMenuTriggerData]=" 'data': 'someData' ">

<mat-menu #menu="matMenu" [hasBackdrop]="false">
  <ng-template matMenuContent let-data="data">
    <child-comp 
      (close)="onCloseMenu()"
      [input-to-child-comp]="data"
    >
    </child-comp>
  </ng-template>
</mat-menu>

[hasBackdrop]="false"避免在外部点击时关闭菜单。

我使用 ng-template 将一些数据传递给子菜单组件。

在子组件中我使用了一个按钮来关闭菜单,

  <mat-icon class="material-icons-outlined" (click)="closeMenu()">close</maticon>

在closeMenu函数中只是发出关闭事件,关闭菜单,

 @Output() close = new EventEmitter();
  closeMenu() 
    this.close.emit();
  

在父组件中,

  @ViewChild(MatMenuTrigger) menu: MatMenuTrigger;
  onCloseMenu() 
    this.menu.closeMenu();
  

& 一切正常。

【讨论】:

【参考方案2】:

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

<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>

您可以像这样编码&lt;other-component&gt;

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 demo看到上面的例子。


另一种方法

另一种方法是(我认为这是您想要的):您的 触发按钮 在父级内部(但在子级外部menu 本身是在 子组件内 定义的。

父组件:

<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, static: true) 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, static: true) menu: MatMenu;

Stackblitz demo

【讨论】:

谢谢你,正如人们所说,第三个是完美的。我第一次遇到 exportAs 属性! 第三个不需要exportAs。只需使用[matMenuTriggerFor]="x.menu"&lt;child-component #x&gt; @jpavel 我的意思是在我今天必须实现它的子组件中没有&lt;mat-menu&gt;(= 第四种方法)并且它也有效,.. @julianobrasil,在 Angular 9 中,默认值已从 static: true 更改为 static: false。如果没有在 Angular 9 中指定 static: true,那么这个演示可能会在控制台中出现错误。我没有检查这个演示,但这是我在代码库中看到的。 @АнтонДосов,谢谢。我已将演示更新为 angular 9。【参考方案3】:

这是另一个使用ng-content 的解决方案。这是我的首选方式。

我的自定义菜单组件 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>

【讨论】:

那个按钮是怎么挂在菜单上的? 看起来最终产品有一个不可见的div,并带有一个围绕实际按钮的点击处理程序。这对我来说不像是声音设计——matMenuTriggerFor 属性确实应该附加到按钮,而不是 div。

以上是关于不同组件中的垫子菜单和按钮的主要内容,如果未能解决你的问题,请参考以下文章

第二百零八节,jQuery EasyUI,SplitButton(分割按钮菜单)组件

Vue 在开发中使用Element框架中的tree组件,配置菜单权限在左侧导航菜单显示,点击子节点菜单时无法获取父节点的id,只有其子节点的和上级菜单的id数组

Vue 在开发中使用Element框架中的tree组件,配置菜单权限在左侧导航菜单显示,点击子节点菜单时无法获取父节点的id,只有其子节点的和上级菜单的id数组

如何修改jQuery mobile子菜单中的关闭按钮以进行初始打开

Android UI常用组件

UI控件之菜单(Menu)