2016-09-02 6 views
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> 

plunker example

は、それが構造的なディレクティブで@HostListenerを使用することが可能かどう質問があるもあります。ここ

は、ディレクティブコードです?

答えて

1

@HostListener作品が、のようなhtmlタグをコメントに適用されています:それは接続されていますので、そう

@Directive({ selector: '[myUnless]' }) 
export class UnlessDirective { 

    constructor(
    private templateRef: TemplateRef<any>, 
    private viewContainer: ViewContainerRef, 
    private renderer: Renderer) { } 

    onClick(event: any) { 
    console.log("click", event); 
    } 

    @Input() set myUnless(condition: boolean) { 
    if (!condition) { 
     this.viewContainer.createEmbeddedView(this.templateRef); 

     const el = this.templateRef.elementRef.nativeElement.nextElementSibling; 
     this.renderer.listen(el, 'click', this.onClick); 
    } else { 
     this.viewContainer.clear(); 
    } 
    } 
} 

Plunker

+0

それは基本的に働いていない:あなたは次の回避策を試すことができます

<!--template bindings={ "ng-reflect-my-unless": "true" }--> 

テンプレートに? –

+0

はい、それは '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

+2

あなたが作成した埋め込みビューから' el'を得ることができます: 'var el = this.viewContainer.createEmbeddedView(this.templateRef).rootNodes [0];' –

関連する問題