通过事件绑定,你可以侦听并响应用户操作,例如按键、鼠标移动、点击和触摸。
要绑定到事件,请使用 Angular 的事件绑定语法。此语法由等号左侧括号内的目标事件名和右侧引号内的模板语句组成。在下面的示例中,目标事件名是 click ,模板语句是 onSave() 。
<button (click)="onSave()">Save</button>
事件绑定侦听按钮的单击事件,并在发生单击时调用组件的 onSave()。
Angular 还支持被动事件侦听器。例如,使用以下步骤使滚动事件变为被动的。
src 目录下创建一个文件 zone-flags.ts 。(window as any)['__zone_symbol__PASSIVE_EVENTS'] = ['scroll'];在
src/polyfills.ts 文件中,在导入 zone.js 之前,先导入新创建的 zone-flags 。 import './zone-flags';
import 'zone.js'; // Included with Angular CLI.
在这些步骤之后,如果你为 scroll 事件添加事件侦听器,侦听器就会是 passive 的。
指令通常使用 Angular 的 EventEmitter 引发自定义事件,如下所示。
EventEmitter 并将其对外暴露为属性。 EventEmitter.emit(data) 发出事件,传入消息数据,该消息数据可以是任何东西。 $event 对象接收数据。 考虑一个 ItemDetailComponent ,它会显示条目信息并响应用户操作。尽管 ItemDetailComponent 显示了一个删除按钮,但它并不包含删除英雄的功能。它只会引发一个报告用户要求删除的事件。
<img src="{{itemImageUrl}}" [style.display]="displayNone">
<span [style.text-decoration]="lineThrough">{{ item.name }}
</span>
<button (click)="delete()">Delete</button> 该组件定义了一个 deleteRequest 返回 EventEmitter 的属性。当用户单击 Delete 时,该组件将调用 delete() 方法,让这个 EventEmitter 发出 Item 对象。
// This component makes a request but it can't actually delete a hero.
@Output() deleteRequest = new EventEmitter<Item>();
delete() {
this.deleteRequest.emit(this.item);
this.displayNone = this.displayNone ? '' : 'none';
this.lineThrough = this.lineThrough ? '' : 'line-through';
}
宿主父组件将绑定到 ItemDetailComponent 的 deleteRequest 事件,如下所示。
<app-item-detail (deleteRequest)="deleteItem($event)" [item]="currentItem"></app-item-detail>
当 deleteRequest 事件触发时,Angular 就会以该条目为参数调用其父组件的 deleteItem()。
为了确定事件的目标,Angular 会检查目标事件的名称是否与已知指令的事件属性匹配。在以下示例中,Angular 会检查 myClick 是否来自自定义指令 ClickDirective 的事件。
<h4>myClick is an event on the custom ClickDirective:</h4>
<button (myClick)="clickMessage=$event" clickable>click with myClick</button>
{{clickMessage}}
如果目标事件名称 myClick 未能匹配元素上的事件或 ClickDirective 的输出属性,则 Angular 将报告“未知指令”错误。