2017-05-02 9 views
2

私は角2の指令によって作成された「ダイナミック」要素にイベントをバインドしようとしているが、私のコードは次のようになります。ディレクティブの追加要素からclickイベントを管理するにはどうすればよいですか?

import { Directive, ElementRef, HostListener, Input } from '@angular/core'; 
@Directive({ 
    selector: '[myHighlight]' 
}) 
export class HighlightDirective { 
    constructor(private el: ElementRef) { } 

    @Input() defaultColor: string; 

    @Input('myHighlight') highlightColor: string; 

    @HostListener('mouseenter') onMouseEnter() { 
    this.highlight(this.highlightColor || this.defaultColor || 'red'); 
    } 

    @HostListener('mouseleave') onMouseLeave() { 
    this.highlight(null); 
    } 

    private highlight(color = "red") { 
    this.el.nativeElement.style.backgroundColor = color; 
    } 

    ngAfterContentInit() { 
    var hbElement = document.createElement('button'); 
    hbElement.innerText = 'Highlight'; 
    hbElement.addEventListener('click', this.highlight); 
    this.el.nativeElement.appendChild(hbElement); 
    } 
} 

をしかし、私はhbElement(ボタン)をクリックしたとき、私は取得しますエラー:Cannot read property 'nativeElement' of undefined this.elがnullなのでクリックがこのディレクティブコンテキストの外で呼び出されるためです。それは指令インスタンスの属性にアクセスすることができますので、私はhbElementでクリックでイベントを追加するにはどうすればよい

答えて

2

あなたは指令にhighlightをバインドする必要があります。

それを達成するために、あなたは.bind(this)

ngAfterContentInit() { 
    var hbElement = document.createElement('button'); 
    hbElement.innerText = 'Highlight'; 
    hbElement.addEventListener('click', this.highlight.bind(this)); // Here 
    this.el.nativeElement.appendChild(hbElement); 
} 

を使用するか、

private highlight = (color = "red") => { 
    this.el.nativeElement.style.backgroundColor = color; 
} 

plnkr

+0

矢印機能を使用することができますおかげで、完全に働いた:) – JohnnyAce

関連する問題