Как транслировать события HostListener с помощью RxJs?

Я нахожу множество ресурсов о том, как привязать Angular HostListeners:

@HostListener('document:click', ['$event'])
handleClick(event: Event) {
     // etc
}

но как мне использовать RxJs вместо этого для потоковой передачи?

documentClickedStream = Observable.fromEvent(/* how to bind this? */)

Не знаю, как выполнить привязку для создания потока «щелкнуть в любом месте» с использованием шаблона декоратора, предложенного в документации по Angular.

чего вы на самом деле пытаетесь достичь? вы хотите, чтобы какой-либо другой компонент в вашем приложении получал уведомление через ngrx всякий раз, когда происходит щелчок по этому компоненту? или же?

dee zg 20.07.2018 19:22

Не могли бы вы указать ссылку на документацию по декораторам?

Wand Maker 20.07.2018 19:25

Упс, обновленный вопрос, я действительно имел в виду, как обрабатывать щелчок в любом месте элемента Host с помощью RxJs, а не ngrx. Я печатал слишком быстро.

FlavorScape 20.07.2018 19:25
Поведение ключевого слова "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) для оценки ваших знаний,...
4
3
2 851
4

Ответы 4

Используйте шаблон ref, чтобы получить ссылку на кнопку

Это будет работать, поскольку мы ориентируемся на документ.

@ViewChild('btn') btn:ElementRef;
documentClickedStream = Observable.fromEvent(window['document'],'click');

Рабочий пример: https://stackblitz.com/edit/rxjs-window

как мне это сделать без кнопки, т.е. всего HostElement?

FlavorScape 20.07.2018 19:31

Вы хотите вызвать это, если вы нажмете где-нибудь в домене?

Chellappan வ 20.07.2018 19:33

Вы проверили документ: щелкните внутри события

Chellappan வ 20.07.2018 19:34

Я не уверен, что могу получить доступ к документу напрямую, поскольку это проект Nativescript, но я могу попробовать.

FlavorScape 20.07.2018 19:36

Нет, это сработает, потому что мы пытаемся выбрать документ

Chellappan வ 20.07.2018 19:39

нельзя использовать в Nativescript (нет документа). Can't find variable: document, однако, работает в сети. Вот почему я думаю, что для доступа к HostElement в Angular требуется прохождение декоратора.

FlavorScape 20.07.2018 20:08

Думаю, самый простой способ - просто использовать промежуточную тему:

  @HostListener('document:click', ['$event'])
  onKeyUp(e:Event) {
      this.clickStream$.next(e);
  }

затем подпишитесь на него как обычно

  this.clickStream$
      .asObservable()
      .pipe(
          // some operators...
      )
      .subscribe();

Вы также можете подписаться на события RxJs, используя приведенный ниже код, добавив приведенный ниже код к событию ngOnInit:

this.subscribe(fromEvent(document, 'visibilitychange'), (e: Event) => {
    console.info('visibilitychange');
    this.getVisibilitychange(true);
});

Вот мой рабочий пример. Сначала вам нужно импортировать эти строки в свой компонент


import { fromEvent } from 'rxjs/internal/observable/fromEvent';

затем поместите этот код в конструктор компонента или в ngOnInit

   fromEvent(document, 'click').subscribe(event => {
      console.info(event);
    })

Но это нарушит рендеринг ssr. Использование @HostListener безопасно. Чтобы ваш код работал на Angular Universal, вы должны использовать токен внедрения DOCUMENT, чтобы внедрить объект документа из DI и использовать его вместо глобального объекта документа.

Adam Kaczmarek 07.07.2021 16:59

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