イベントバインディングを使用すると、キーストローク、マウスの動き、クリック、タッチなどのユーザーアクションをリスンし、それに応答できます。
イベントへのバインディング
HELPFUL: プロパティへのバインディングの詳細については、プロパティバインディングを参照してください。
イベントにバインディングするには、Angularのイベントバインディング構文を使用します。 この構文は、等号の左側に括弧で囲まれたターゲットイベント名、右側に引用符で囲まれたテンプレートステートメントという構成です。
次の例を作成します。ターゲットイベント名はclick
、テンプレートステートメントはonSave()
です。
イベントバインディング構文
<button (click)="onSave()">Save</button>
イベントバインディングは、ボタンのクリックイベントをリスンし、クリックが発生するたびにコンポーネントのonSave()
メソッドを呼び出します。
イベントターゲットの特定
イベントターゲットを特定するために、Angularはターゲットイベント名が既知のディレクティブのイベントプロパティと一致するかどうかをチェックします。
次の例を作成します。(AngularはmyClick
がカスタムClickDirective
のイベントかどうかをチェックします)
src/app/app.component.html
<h1 id="event-binding">Event Binding</h1><div class="group"> <h3>Target event</h3> <button type="button" (click)="onSave($event)">Save</button> <button type="button" on-enter="onSave()">on-click Save</button> <h4>myClick is an event on the custom ClickDirective:</h4> <button type="button" (myClick)="clickMessage=$event" clickable>click with myClick</button> {{ clickMessage }}</div><div class="group"> <h3>$event and event handling statements</h3> <h4>Result: {{ currentItem.name }}</h4> <input [value]="currentItem.name" (input)="currentItem.name=getValue($event)"> without NgModel</div><div class="group"> <h3>Binding to a nested component</h3> <h4>Custom events with EventEmitter</h4> <app-item-detail (deleteRequest)="deleteItem($event)" [item]="currentItem"></app-item-detail> <h4>Click to see event target class:</h4><div class="parent-div" (click)="onClickMe($event)" clickable>Click me (parent) <div class="child-div">Click me too! (child) </div></div><h3>Saves only once:</h3><div (click)="onSave()" clickable> <button type="button" (click)="onSave($event)">Save, no propagation</button></div><h3>Saves twice:</h3><div (click)="onSave()" clickable> <button type="button" (click)="onSave()">Save with propagation</button></div>
ターゲットイベント名myClick
がClickDirective
の出力プロパティと一致しない場合、Angularは代わりに基になるDOM要素のmyClick
イベントにバインドします。
キーボードイベントへのバインディング
Angularのバインディング構文を使用して、キーボードイベントにバインドできます。キーボードイベントにバインドするキーまたはコードを指定できます。key
フィールドとcode
フィールドは、ブラウザのキーボードイベントオブジェクトのネイティブな一部です。デフォルトでは、イベントバインディングはキーボードイベントのkey
フィールドを使用することを前提としています。code
フィールドも使用できます。
キーの組み合わせは.
(ピリオド)で区切ることができます。たとえば、keydown.enter
を使用すると、enter
キーにイベントをバインドできます。shift
、alt
、control
、Macのcommand
キーなどの修飾子キーも使用できます。次の例は、キーボードイベントをkeydown.shift.t
にバインドする方法を示しています。
<input (keydown.shift.t)="onKeydown($event)" />
オペレーティングシステムによっては、一部のキーの組み合わせが期待するキーの組み合わせではなく、特殊文字を作成することがあります。たとえばmacOSでは、オプションキーとシフトキーを同時に使用すると特殊文字が作成されます。keydown.shift.alt.t
にバインドすると、macOSではその組み合わせによってt
ではなくˇ
という文字が生成されます。これはバインディングと一致せず、イベントハンドラーはトリガーされません。macOSでkeydown.shift.alt.t
にバインディングするには、この例に示すようにkeydown.code.shiftleft.altleft.keyt
などのcode
キーボードイベントフィールドを使用して、正しい動作を取得します。
<input (keydown.code.shiftleft.altleft.keyt)="onKeydown($event)" />
code
フィールドはkey
フィールドよりも具体的なものです。key
フィールドは常にshift
を報告しますが、code
フィールドはleftshift
またはrightshift
を指定します。code
フィールドを使用する場合、必要なすべての動作をキャッチするために、別々のバインディングを追加する必要がある場合があります。code
フィールドを使用すると、macOSのshift + option
の動作などのOS固有の動作を処理する必要がなくなります。
詳細については、keyとcodeの完全なリファレンスを参照してください。
パッシブイベントへのバインディング
Angularはパッシブイベントリスナーもサポートしています。
これは、ほとんどのアプリケーションでは不要な高度なテクニックです。パフォーマンスの問題を引き起こしている頻繁に発生するイベントの処理を最適化する必要がある場合に役立ちます。
たとえば、スクロールイベントをパッシブにするには、src/index.html
で特別なzone.jsフラグを設定する必要がある場合があります。
<!doctype html><html> <head> <script> window.__zone_symbol__PASSIVE_EVENTS = ['scroll']; </script> </head> <body> <app-root></app-root> </body></html>
これらの手順の後、scroll
イベントのイベントリスナーを追加すると、リスナーはpassive
になります。
上記の場合、zone.jsを使用しているアプリケーションのみに適用されることに注意してください。