2
属性ディレクティブのように、ホスト上のイベントをリッスンする必要がある構造ディレクティブがあります。構造ディレクティブのHostListenerを使用
指示文に@HostListener
を使用する際にエラーはありませんが、イベントは受信されません。
import { Directive, HostListener, Input } from '@angular/core';
import { TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({ selector: '[myUnless]' })
export class UnlessDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef
) { }
@HostListener("click", ["$event"]) public onClick(event: any) {
console.log("click", event);
}
@Input() set myUnless(condition: boolean) {
if (!condition) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
}
とテンプレート::
<h1>Structural Directive with HostListener</h1>
<p *myUnless="condition">
condition is false and myUnless is true.
</p>
<p *myUnless="!condition">
condition is true and myUnless is false.
</p>
は、それが構造的なディレクティブで@HostListener
を使用することが可能かどう質問があるもあります。ここ
は、ディレクティブコードです?
それは基本的に働いていない:あなたは次の回避策を試すことができます
テンプレートに? –
はい、それは 'visitEmbeddedTemplate'(https://github.com/angular/angular/blob/2.0.0-rc.6/modules/%40angular/compiler/src/view_compiler/view_binder.ts#L94)にあります。 'visitElement'ではなく' bindRenderOutputs'メソッドはありません(https://github.com/angular/angular/blob/2.0.0-rc.6/modules/%40angular/compiler/src/view_compiler/view_binder.ts# L68)したがって、 'HostListener'はこの場合無効です – yurzui
あなたが作成した埋め込みビューから' el'を得ることができます: 'var el = this.viewContainer.createEmbeddedView(this.templateRef).rootNodes [0];' –