У меня есть этот плагин углового события: (скопировано из там)
@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
EventManager
является частью модулей браузера и получает все плагины как часть зависимостей своего конструктора.
/**
* Initializes an instance of the event-manager service.
*/
constructor(plugins: EventManagerPlugin[], _zone: NgZone);
После создания экземпляра EventManager нельзя добавлять дополнительные плагины.
Вы не должны использовать зависимости поставщиков для выполнения бизнес-логики. Если вы хотите использовать плагин условно, то добавьте в плагин логику. Вы можете внедрить плагин в свой компонент, чтобы настроить его работу в зависимости от жизненного цикла компонента.
Вы можете добавить свой собственный «префикс» к событиям, чтобы они использовались только вашей библиотекой, а затем реализовать «forRoot ()» в своем модуле, чтобы убедиться, что он загружен в основной модуль. Если вы хотите прослушивать события щелчка без обнаружения изменений, просто добавьте прослушиватель событий DOM с помощью ванильного JavaScript.
Да приставка вроде хорошая. Что касается ванильных слушателей, это немного сложно, потому что элементы находятся внутри цикла ngFor ... в любом случае спасибо;)
Это интересно, поэтому это невозможно. В моем случае я пытался сделать это, потому что это для библиотеки, и я не хочу, чтобы это затрагивало все приложение пользователей библиотеки .. У вас есть идея кода для этого варианта использования?