Как получить доступ к всплывающему элементу с повторяющимся именем внутри компонента?

Я пытаюсь вызвать функцию переключения всплывающего окна внутри таблицы материалов Angular.

Если ячейка в таблице имеет фокус с вкладками, я бы хотел, чтобы всплывающее окно открывалось, когда пользователь нажимает клавишу «Ввод». Это будет имитировать поведение, когда пользователь щелкает ячейку таблицы.

Моя проблема в том, что компоненту всплывающего окна дается имя #valuePopover, которое является одним и тем же именем для всех ячеек в таблице.

<ng-container matColumnDef = "value">
  <th mat-header-cell *matHeaderCellDef> Value </th>
  <td mat-cell *matCellDef = "let entry;" tabindex = "0"
    [satPopoverAnchorFor] = "valuePopover" (click) = "valuePopover.toggle()" 
    (keypress) = "openPopover($event)">
    <span>{{entry.value}}</span>
    <sat-popover #valuePopover hasBackdrop xAlign = "start" yAlign = "start" (closed) = "updateField(entry, $event)">Hello!
    </sat-popover>
  </td>
</ng-container>

Для события (щелчок) он работает нормально, так как может просто вызвать функцию 'valuePopover.toggle()'. Однако с помощью события нажатия клавиши мне нужно проверить, была ли нажата клавиша ввода, и мне нужно сделать это в компоненте.

@ViewChild('valuePopover') popover; 

openPopover(event: KeyboardEvent) {
  if (event.keyCode == 13) popover.toggle();
}

Функция openPopover всегда открывает всплывающее окно первой ячейки, но не той, на которой находится фокус с вкладкой!

Кто-нибудь знает, как я могу реализовать это либо в html, либо в компоненте?

Я использую компонент "sat-popover", который вы можете найти здесь: https://github.com/ncstate-sat/popover

Выйдите event в консоль. Вы должны видеть currentTarget. Отсюда вы можете определить родительский элемент DOM и инициировать событие щелчка по нему, а обработчику щелчка позволить сделать все остальное.

Diodeus - James MacFarlane 29.05.2019 20:55

@Diodeus-JamesMacFarlane Когда я вывожу event.currentTarget, я получаю следующее: ​.addEventListener:cl‌​ick","zone":"angular‌​","runCount":0}],"__‌​zone_symbol__keypres‌​sfalse":[{"type":"ev‌​entTask","state": "ru‌​nning","source":"HTM‌​LTableCellElement.ad‌​dEventListener:keypr‌​ess","zone":"angular‌​","runCount":2}]} Я не понимаю, как я могу получить родительский элемент из этого?

Tom O'Brien 30.05.2019 11:04
this.element = event.target См.: blog.thoughtram.io/angular/2017/02/21/…
Diodeus - James MacFarlane 30.05.2019 16:38
Тестирование функциональных 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
0
3
377
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я решил это с помощью пользователя Diodeus - James McFarlane, предотвратив событие по умолчанию и вызвав метод click для event.target следующим образом:

openPopover(event) {
  if (event.keyCode == 13) {
    event.preventDefault();
    var element:HTMLElement = event.target;
    element.click();
  }
}

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