Как прослушать mousemove внутри компонента диалогового окна углового материала?

В моем приложении нужно постоянно отслеживать движение мыши.

В файле app.component.ts я разместил следующий код:

ngOnInit() {
document.addEventListener("mousemove", (e) => {
  //foo() 
 });
})

Все работает так, как ожидалось, за исключением диалога.

Диалог представляет собой Компонент Angular Material Dialog, и код его создания выглядит следующим образом:

openModal() {
    const dialogRef = this.dialog.open(ModalComponent, {
      panelClass: 'generic-dialog-container',
      data: {
        header: 'Leave session',
        content:
          'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
        isInfo: false,
      },
    });

    this.dialogSub = dialogRef.componentInstance.isApprove.subscribe(
      isApprove => {
        if (isApprove) {
          this.navigateBack();
        }
      },
    );
  }

Я попытался добавить прослушиватель событий внутри модального OnInit - не сработало, плюс я увидел, что когда я добавляю его в app.component.ts в документ, прослушиватель добавляется к элементу тела и обертывает все приложение, так:

Как прослушать mousemove внутри компонента диалогового окна углового материала?

Когда диалоговое окно открыто, прослушиватель событий прослушивает события мыши на компоненте в фоновом режиме (компонент, который вызывает открытие диалогового окна), но не в самом диалоговом окне.

После закрытия диалогового окна и его повторного открытия прослушиватель событий прослушивает события мыши также внутри диалогового окна, как и ожидалось.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
2 257
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы не стал использовать объект документа для добавления слушателей, а вместо этого создал бы Observable с оператором fromEvent. Что касается диалога, Angular Material может мешать распространению событий. Попробуйте Observable и посмотрите, что произойдет.

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

Вы можете использовать Хост-слушатель для прослушивания событий mousemove внутри вашего ModalComponent:

import { Component, Inject, HostListener } from '@angular/core';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';

// ...

export class ModalComponent {

  constructor(
    public dialogRef: MatDialogRef<ModalComponent>,
    @Inject(MAT_DIALOG_DATA) public data: DialogData) { }

  @HostListener('mousemove', ['$event'])
  handleMousemove(event) {
    console.info(`x: ${event.clientX}, y: ${event.clientY}`);
  }
}

Изнутри обработчика событий mousemove вы можете искать данные по мере необходимости, возможно, через общую службу, используя в своих интересах темы RxJS, такие как BehaviorSubjects, на которые подписаны другие компоненты/службы.

Вот пример в действии. Обратите внимание, что событие mousemove срабатывает только тогда, когда мышь находится в пределах модального окна.

Надеюсь, это поможет!

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