2016-01-11 13 views
30

angularjs 2でホストリスナーとホストバインディングを使用する方法は? 私はこのようにホストリスナーに対して試みましたが、常に「宣言が必要です」というエラーが表示されました。角度2:ホストバインドとホストリスニング

app.component.ts:

import {Component, EventEmitter, HostListener, Directive} from 'angular2/core'; 

@Directive({ 
    selector: 'button[counting]' 
}) 

class HostSample { 
    public click = new EventEmitter(); 
    @HostListener('click', ['$event.target']); 
    onClickBtn(btn){ 
     alert('host listener'); 
    } 
} 

@Component({ 
    selector: 'test', 
    template: '<button counting></button>', 
    directives: [HostSample] 
}) 

export class AppComponent { 
    constructor(){ 
    } 
} 

答えて

61

@HostListenerは、コールバック/イベントハンドラメソッドのデコレータであるので、この行の末尾に;を削除します。ここでは

@HostListener('click', ['$event.target']); 

は、作業ですplunker私はAPI docsからコードをコピーして生成しましたが、わかりやすくするために同じ行にonClick()メソッドを入れました:

結合

ホストがグローバルイベントをリッスンするためにも使用することができ

import {Component, HostListener, Directive} from 'angular2/core'; 

@Directive({selector: 'button[counting]'}) 
class CountClicks { 
    numberOfClicks = 0; 
    @HostListener('click', ['$event.target']) onClick(btn) { 
    console.log("button", btn, "number of clicks:", this.numberOfClicks++); 
    } 
} 
@Component({ 
    selector: 'my-app', 
    template: `<button counting>Increment</button>`, 
    directives: [CountClicks] 
}) 
export class AppComponent { 
    constructor() { console.clear(); } 
} 

To listen to global events, a target must be added to the event name. The target can be window, document or body (reference)

@HostListener('document:keyup', ['$event']) 
handleKeyboardEvent(kbdEvent: KeyboardEvent) { ... } 
+0

ありがとうございました。今私は間違いを見つけました。私はこの行の最後にセミコロンを使用しました - > @HostListener( 'click'、['$ event.target']);これにより、宣言に予想されるエラーが発生しました。 –

+0

私は 'blur'イベントでこれをやっていますが、Chromeでは動作しますがIE 11では動作しません。私は現在angle2 beta.8を使用しています。角polyfillsからのエラー:例外: "ぼかし"の評価中のエラー オリジナル例外:TypeError:オブジェクトはこのアクションをサポートしていません。これまで見たことがない新しい質問を開くことができますが、すぐにrcにアップグレードする必要があります。 – ps2goat

+0

plunkerの例は素晴らしいです。私はデコレータHostListenerを理解しています。ボタンカウンターをするだけでこのデコレータを省略することは可能ですか?私はコンポーネントの中で(クリック)= function()...という意味で、この場合よりもはっきりしていません。 – stackdave

1
@HostListener('click', ['$event.target']); 

Rajcok Sを@マークするコメントに@BhaRathi RajaManiで述べたように;を削除答え

13

これは、両方を使用する単純な例です。

import { 指令、HostListener、HostBinding } '@ angular/core'からの ;

@Directive({ 
    selector: '[Highlight]' 
}) 
export class HighlightDirective { 
    @HostListener('mouseenter') mouseover() { 
    this.backgroundColor = 'green'; 
    }; 

    @HostListener('mouseleave') mouseleave() { 
    this.backgroundColor = 'white'; 
    } 

    @HostBinding('style.backgroundColor') get setColor() { 
    return this.backgroundColor; 
    }; 

    private backgroundColor = 'white'; 
    constructor() {} 

} 

紹介:

  1. HostListenerは、要素にイベントをバインドすることができます。
  2. HostBindingは、要素にスタイルをバインドできます。
  3. これはディレクティブですので、我々は

    いくつかのテキストのためにそれを使用することができます
  4. ので、デバッグによると、私たちはこのdiv要素が スタイル=バインドされていることを見つけることができる「背景色を:白」

    一部のテキスト
  5. このdivのEventListenerには、mouseentermouseleaveの2つのイベントがあります。だから私たちがdivにマウスを動かすと、色は緑色になり、マウスが離れると色は白くなります。

+0

Angular 2コースのこの例は悪いと思います。この例では分かりにくいです。 – Notflip

+0

人気のあるコースAngular 2 - Udemyに関する完全ガイドのこの例。 –

+0

私は知っています。 :)それは悪い例imhoです。 – Notflip