输入属性
父组件单向向子组件中传值
父组件:
12<div>我是父组件</div><app-child [myVal]="val"></app-child>1val: string = '这是在父组件的控制器中赋值!';子组件
1<div>{{myVal}}</div>123//在子组件中将“myVal”声明为输入属性//至此,父组件中的值就能直接传递给"myVal"了@Input() myVal;
输出属性
数据从子组件中发射,在父组件中捕获
子组件:对外发射数据
1234567① @Output()② outObjName: EventEmitter<Product> = new EventEmitter();constructor(){③ let prod: Product = new Product("joy",13);④ this.outObjName.emit(prod);}- ①②表示声明一个输出属性(也可以说成输出对象),该属性具有发射数据的能力;
- ②中,需要为声明的属性指明一个泛型,EventEmitter<泛型>。该泛型即是:对外发射的数据的类型;
- ③生成一个符合规则的数据;
- ④使用输出属性将数据发射出去(发射到父组件中);
- 父组件:接收来自于子组件的数据 12<div>我是父组件</div>④ <app-child (outObjName)="getDataFromChild($event)"></app-child>
|
|
在Angular中,捕获子组件中发射的事件,和捕获原生的DOM事件是一样的操作。
- ①中新建了了一个Product的实例,为接收数据做准备;
- ②自定义函数,捕获从子组件中发射出来的指定类型的数据;
- ③使用捕获到的数据
- ④对子组件中发射事件进行监听,一旦捕获到,立即响应指定的操作(getDataFromChild)
补充说明:
- 一般情况下,父组件中“捕获的事件名称”和子组件中“输出属性的名称”保持一致;
- 如果需要给输出属性指定别名,可以:@Output(‘otherName’)。这时,在父组件中④的位置outObjName需要与otherName相同;
中间人模式:
- 简单来说,使用一个公共的父组件来连通两个不相关的组件,使之间的数据和事件响应在一定程度上得到关联;
- 使用中间人模式既实现既定功能,也实现了组件之间的解耦;