在angular开发中,经常会遇到子组件与父组件通信的问题,父组件可以通过类似属性绑定的方式将值赋到子组件标注 @Iutput
的属性上,反之,如果子组件需要将值传递到父组件,使用事件来传递是常用的方案之一。下面对自定义事件做简单介绍:
1、需求
创建两个组件,一个父组件,一个子组件,子组件中有个表单和按钮,父组件嵌入子组件到页面中。需要达到的效果是:在子组件的表单中输入内容,再点击子组件中的按钮,将子组件表单中的内容传递给父组件,并在父组件中显示出来。示意图如下:

2、子组件实现核心
核心要点有三点:
- 使用
@Output
注解修饰属性(表示子组件可以向上触发事件) - 使用EventEmitter类,此类用于传递事件
- 调用EventEmitter的emit()方法,用于触发事件
子组件的TypeScript代码如下【注意代码12、19行】:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import {Component, EventEmitter, OnInit, Output} from '@angular/core';
({
selector: 'app-app-event-child',
templateUrl: './app-event-child.component.html',
styleUrls: ['./app-event-child.component.css']
})
export class AppEventChildComponent{
username: string; // 与表单绑定的本地变量
// 事件传递的核心对象,要点:1、@Output;2、EventEmitter
any> = new EventEmitter(); () myEvent: EventEmitter<
/**
* 推动username到父组件
*/
pushUserName(): void {
// 将事件传递到上一层
this.myEvent.emit(this.username);
}
}
子组件的html代码如下【注意代码8、13行】:
1 | <div> |
3、父组件实现核心
核心要点分为三点:
- 引入子组件时,使用事件绑定语法绑定子组件的
@Output
修饰的属性 - 实现事件触发所调用的函数
- 调用函数如果有参数传递,一定要传入
$event
父组件的TypeScript代码如下【注意:12~16行代码】:
1 | import {Component, OnInit} from '@angular/core'; |
父组件的HTML代码如下【注意第8行代码】:
1 | <div> |