Angular: как использовать настраиваемый плагин EventPlugin только внутри определенного компонента вместо всего ngModule?

У меня есть этот плагин углового события: (скопировано из там)

@Injectable()
    export class UndetectedEventPlugin {
    manager: EventManager;

    supports(eventName: string): boolean {
        return eventName.indexOf('undetected.') === 0;
    }

    addEventListener(element: HTMLElement, eventName: string, handler: Function): Function {
        const realEventName = eventName.slice(11);
        return this.manager.getZone().runOutsideAngular(() => this.manager.addEventListener(element, realEventName, handler));
    }
}

Если я добавлю его к провайдеру модуля, он будет отлично работать везде в приложении:

@NgModule({
  imports:      [ BrowserModule ],
  declarations: [ AppComponent,... ],
  bootstrap:    [ AppComponent ],
  providers: [{
      provide: EVENT_MANAGER_PLUGINS,
      useClass: UndetectedEventPlugin,
      multi: true
  }]
})
export class AppModule {}

Но вместо этого, если я добавлю его к определенному поставщику компонентов следующим образом:

@Component({
  selector: 'hello',
  providers: [{
    provide: EVENT_MANAGER_PLUGINS,
    useClass: UndetectedEventPlugin,
    multi: true
  }],
  template: `<button (click) = "test()">BTN 1: (click) = "test()"</button><br><br>
             <button (undetected.click) = "test()">BTN 1: (undetected.click) = "test()"</button>`,
})
export class HelloComponent {
  test() {
    console.info('TEST FUNCTION')
  }
}

Не работает. Кажется, он должен быть глобальным для всего приложения, но я не уверен в этом ..

Знаете ли вы, как ограничить область действия eventPlugin компонентом?

Демо: https://stackblitz.com/edit/angular-jk4gpm?file=src%2Fapp%2Fhello.component.ts

Тестирование функциональных 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
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

EventManager является частью модулей браузера и получает все плагины как часть зависимостей своего конструктора.

/**
 * Initializes an instance of the event-manager service.
 */
constructor(plugins: EventManagerPlugin[], _zone: NgZone);

После создания экземпляра EventManager нельзя добавлять дополнительные плагины.

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

Это интересно, поэтому это невозможно. В моем случае я пытался сделать это, потому что это для библиотеки, и я не хочу, чтобы это затрагивало все приложение пользователей библиотеки .. У вас есть идея кода для этого варианта использования?

bertrandg 18.12.2018 16:53

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

Reactgular 18.12.2018 17:15

Да приставка вроде хорошая. Что касается ванильных слушателей, это немного сложно, потому что элементы находятся внутри цикла ngFor ... в любом случае спасибо;)

bertrandg 18.12.2018 17:56

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