Angular: Как открыть два мат-меню в одном HTML?

Angular: Как открыть два мат-меню в одном HTML?

Здесь у меня есть два matmenus в HTML одного компонента. При открытии второго matmenu (второе matmenu открывается, когда я щелкаю правой кнопкой мыши по этому div), но открывается первое matmenu, так как по-разному открывать оба меню в одном компоненте HTML при разных щелчках в angular?

HTML

(this is first menu)
<mat-icon style = "cursor: pointer;" [matMenuTriggerFor] = "menu">more_vert   
  <mat-menu #menu = "matMenu"> 
    <button mat-menu-item (click) = "addNewItem()">New Folder</button>
    <button mat-menu-item (click) = "uploadFiles()">Upload Files</button>
  </mat-menu> 
</mat-icon>

(This is second menu)

<mat-card *ngFor = "let imagespayload of uploadedImagesObj"(click) = "activeFolder=imagespayload"
   (contextmenu) = "onContextMenu($event, imagespayload)">

   <div style = "position: fixed"
     [style.left] = "contextMenuPosition.x"
     [style.top] = "contextMenuPosition.y"
     [matMenuTriggerFor] = "contextMenu"
     [matMenuTriggerData] = "{item: imagespayload}">
   </div>

  <mat-menu #contextMenu = "matMenu">
    <ng-template matMenuContent let-item = "item">
      <button mat-menu-item>Action 1</button>
      <button mat-menu-item>Action 2</button>
    </ng-template>
  </mat-menu>

TS

  import { Component, OnInit, Input,ViewChild } from '@angular/core';
  import { MatMenuTrigger } from '@angular/material';

  @ViewChild(MatMenuTrigger) contextMenu: MatMenuTrigger;
  contextMenuPosition = { x: '0px', y: '0px' };

 onContextMenu(event: MouseEvent, imagespayload) {
   event.preventDefault();
   this.contextMenuPosition.x = event.clientX + 'px';
   this.contextMenuPosition.y = event.clientY + 'px';
   this.contextMenu.menuData = { imagespayload};
   this.contextMenu.openMenu();
}
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
1 987
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первое меню открывается вместо второго, потому что @ViewChild() привязывается к первой директиве, соответствующей данному селектору, которым в данном случае является matMenuTrigger для вашего первого меню. Чтобы вместо этого привязать его ко второму триггеру меню, используйте ссылочную переменную шаблона для элемента с триггером:

<div #trigger = "matMenuTrigger"
    style = "position: fixed"
    [style.left] = "contextMenuPosition.x"
    [style.top] = "contextMenuPosition.y"
    [matMenuTriggerFor] = "contextMenu"
    [matMenuTriggerData] = "{item: imagespayload}">
</div>

Затем в вашем .ts:

@ViewChild('trigger') trigger: MatMenuTrigger;

this.trigger.openMenu();

Для справки см. Документация Angular ViewChild, MatMenuTrigger API и эта почта об использовании ссылочных переменных шаблона с директивами.

Другие вопросы по теме