2017-08-05 4 views
0

私は、ホストイベントリスナーを使用してキーボードイベントにサブスクライブするディレクティブを作成しました。エスケープキーを押すと、このような出力イベントが発生します。アンカー2ホストイベントリスナーバブリング

@HostListener('document:keyup', ['$event']) 
    handleKeyboardEvent(kbdEvent: KeyboardEvent) { 
     if (kbdEvent.keyCode === 27) { 
      this.CloseEvent.emit(); 
     } 
    } 

私はこの要素が子要素になっています。エスケープキーが押されると、私は新しく加入した要素の出力イベントだけを発生させたい。問題は、階層的な順序に基づいてイベントが発生するエスケープ・キーをクリックしたときです。私はここでデモを行った。再現するhttps://plnkr.co/edit/FfnHAtxl2zcHsu0JilKt

ステップ:

  1. 複数の子要素を追加]をクリックしますエスケープそれ

すべての要素を閉じ予想される動作で:

  1. 最後に追加された子要素イベントでエスケープキーをクリックすると、イベントが発生する必要があります
+1

この '' document:keyup''ディレクティブのすべてのインスタンスは、keyupのグローバルイベントリスナーを追加するので、キーをどこに置いても、ディレクティブのすべてのインスタンスで放出されます。ここでコンソールを参照してくださいhttps://plnkr.co/edit/9paiFapxVf2yaB6uPAnc?p=preview – Toxicable

+0

あなたは正しい方法です。最近追加されたサブスクライブされたインスタンスを最初に起動し、他のインスタンスが停止するのを避けるようにイベントの伝播を停止する方法はありますか発射? –

答えて

0

レンダリング要素のkeyupイベントを聞く必要があります。

@HostListener('keyup') onKeyup() { 
    this.defaultColor.emit(''); 
} 

LIVE DEMO

0

あなたはdocument:keyupにイベントリスナーをアタッチしています。

Documentインターフェイスは、ブラウザに読み込まれたすべてのWebページを表します。

@HostListener('keyup', ['$event'])を試して、属性ディレクティブをホストするDOM要素のkeyupイベントを購読してください。

+0

返信ありがとうございます。登録した要素に焦点を当てている場合にのみ、このキーアップを起動します。 –

+0

@abhilashreddyはい。これは更新されたPlunkerですhttps://plnkr.co/edit/IQgwhySCDzyrELGCQXcS?p=preview – Jaime