您可以通过使用带有 @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>
这里还有一个link 指向实现它的 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 示例的link。