Вы можете добавить дополнительные параметры, используя псевдонимы с декоратором @Input
.
Вот пример того, как вы можете расширить директиву из связанного поста с другим параметром.
import { NgZone, ElementRef, EventEmitter, Input, Output, Directive } from '@angular/core'
@Directive({
selector: '[outSideEventHandler]'
})
export class OutSideEventHandlerDirective {
private handler: Function;
@Input() event: string = 'click'; // pass desired event
@Output('outSideEventHandler') emitter = new EventEmitter();
@Input('outSideEventType') type = 'default type';
constructor(private ngZone: NgZone, private elRef: ElementRef) {}
ngOnInit() {
console.log(this.type);
this.ngZone.runOutsideAngular(() => {
this.handler = $event => this.emitter.emit($event);
this.elRef.nativeElement.addEventListener(this.event, this.handler);
});
}
ngOnDestory() {
this.elRef.nativeElement.removeEventListener(this.event, this.handler);
}
}
Затем вы можете использовать его следующим образом:
<button (outSideEventHandler)="onTestDirective()" [outSideEventType]="'My type'">Test Directive</button>
Здесь также есть ссылка на образец StackBlitz, который его реализует.Он выводит тип в журнал консоли, чтобы можно было применить его.
Здесь также есть решение для регистрации нескольких обработчиков событий, чтобы ответить и на ваше добавление.Я думаю, что для этого лучше всего иметь входной параметр по умолчанию и отправлять массив пар имени события и обработчика в директиву.Например, вы можете создать объект EventHandler:
export class EventHandler {
public event: string;
public handler: EventListener;
}
Затем изменить директиву, чтобы принимать только один вход по умолчанию, который является массивом объектов EventHandler.
import { NgZone, ElementRef, EventEmitter, Input, Output, Directive } from '@angular/core';
import { EventHandler } from './event-handler';
@Directive({
selector: '[outSideEventHandlers]'
})
export class OutSideEventHandlerDirective {
@Input() public outSideEventHandlers: EventHandler[];
constructor(private ngZone: NgZone, private elRef: ElementRef) {}
ngOnInit() {
this.ngZone.runOutsideAngular(() => {
for (let eventHandler of this.outSideEventHandlers) {
console.log(eventHandler.event);
this.elRef.nativeElement.addEventListener(eventHandler.event, eventHandler.handler);
}
});
}
ngOnDestory() {
for (let eventHandler of this.outSideEventHandlers) {
this.elRef.nativeElement.removeEventListener(eventHandler.event, eventHandler.handler);
}
}
}
Затем вы используете его вшаблон таким образом:
<button [outSideEventHandlers]="[{ event: 'click', handler: onClick }, { event: 'mousedown', handler: onMouseDown }, { event: 'mouseup', handler: onMouseUp}]">Test Directive</button>
Таким образом, вы можете добавить столько обработчиков, сколько хотите, к одному элементу без каких-либо дополнительных свойств в директиве.Вот ссылка на образец StackBlitz, реализующий этот подход.