2017-05-16 2 views
1

を表示できない:角度クリックイベントでは、それはあなたがイベントを監視するために、一般的なHTML要素を指定することができますjQueryの仕組み示す最高だために私が探しているものを説明するために

$("label").on("click", function(event){ 
    // do stuff to this element 
}); 

や伝統的なaddEventListenerをし

document.getElementsByTagName('label').addEventListener('click', function(event){ 
    // do stuff to this element 
}); 

私はすべてインターネット上でこのソリューションを見ないように驚いて、代わりに私はもちろん、あなたがすべてのあなたのビューの上にそのハンドラを配置したいとは思わないでしょう(click)="clickHandler"を結合イベントを使用する方法の例の多くを参照してください。

ジェネリックイベントをアングルで見る方法については、いくつかの方向/リンクを得ることができますか?

UPDATE: @HostListener DOM全体を聞いて、Renderer2という特定の一般的な要素と明らかにObservableオプションで動作するかどうかの議論がありがたいです。

+2

あなたが動的にイベントを添付するために探していますか? JS側にイベントを添付したいのですか?個人的には、angleのテンプレートシンタックスのイベントバインディング表記法: '(event)'はJS側のすべての作業よりもはっきりと清潔です。とにかく、ここで探しているものを見つけることができます:http://stackoverflow.com/questions/35080387/dynamically-add-event-listener-in-angular-2 –

+0

同じハンドラを別の場所で使用すると、あなたはコンポーネントを作成しようとすることができます – runit

+0

ちょっと@AhmedMusallamそれは私のビューで20回以上のイベントバインディングを適用するのが間違っているようです。しかし、「レンダラー」は答えのように見える、ありがとう! – BenRacicot

答えて

0

あなたはRxjsの観測を使用して、DOMイベントにサブスクライブすることができます

var button = document.querySelector('button') 

Rx.Observable.fromEvent(button, 'click') 
    .subscribe(
    (event) => console.log(event) 
    ) 
+1

イベントが追加されたり、特定の状況がなく、そのコードが 'AftreViewInit'コンポーネントのライフサイクルにない限り、' document.querySelector'を実行することをお勧めします。 –

+0

それはobservablesの利点が追加されたreferrerと同じことです – Yeysides

+1

私はRxjsに疲れています。それは正規表現のようなものです。あなたはそれを使って問題を解決し、次に2つの問題があります。 – cgTag

0

@Output形式((click)="")は、DOMイベント(例えば例はonclickのためになる)のための角度のラッパーです。 Angularは、子コンポーネントと親コンポーネントの間の変更検出を管理し、これらを使用して、@Inputs@Outputsを使用するため、重要です。

AngularはDOM API自体で動作するために多くのことを行いますが、あまりにも多すぎます。多くの場合、動作を処理するためのディレクティブまたは拡張コンポーネントを使用することができます。あなたは世界的に、実行時に何かを配置したい場合

しかし、あなたはあなたのコンポーネントにRendererを注入できます。

constructor(public el: ElementRef, public renderer: Renderer) { 
    renderer.listenGlobal('document', 'click', (event) => { 
    // Do something with 'event' 
    }); 
} 

注:減価償却とは若干異なるAPIでRenderer2に置き換えられますようRendererがマークされています。

+0

私はこれが利用可能であったことを知らなかった、ありがとう! – Yeysides

+0

角度で仮想DOMを使用していますか?これをサポートするためのリンクを教えてください。 –

+0

もっと研究したら、私は間違っているかもしれません。私はスタイリングのためにShadow DOMの使用を混乱させていました。お返事を編集しました – joh04667

2
宣言型のソリューションについては

あなたは文書全体のための単一のクリックハンドラは、任意のコンポーネントでこれを入れたい場合:

@HostListener('document:click', ['$event']) 
onDocumentClick(event: MouseEvent) { 
    console.log(event); 
} 
+0

非常に面白いです – Yeysides

+0

これを見ましたが、多くのイベントバインディングを追加することの懸念のように、 '@HostListener'をインポートして使用することは、明らかにDOM全体または' Renderer2 '特定の要素をリッスンしますか? – BenRacicot

+0

HostListenerは、(それを定義したコンポーネントのインスタンスごとに)1つのイベントリスナーのみをアタッチします。アプリケーション全体に対して単一のイベントリスナーを必要とする場合は、AppComponentなど、一度だけ存在するコンポーネントに配置します。私は自分の答えがjoh04667の答えと同等だと思うが、それはより宣言的なスタイルだということを除けばと思う。 – dbandstra

関連する問題