一、父组件给子组件传值 @Input
父组件给子组件不仅可以传递简单的数据,还可以把父组件的方法以及整个父组件传递给子组件。
1、父组件调用子组件的时候传入数据
2、子组件引入Input模块
import {Component, Input, OnInit} from '@angular/core';
3、子组件中@Input接收父组件传递过来的值
export class HeaderComponent implements OnInit {
@Input()
title = '';
constructor() { }
ngOnInit() {
}
}
4、在子组件中展现title值
{{title}}
二、父组件给子组件传方法(即子组件调用父组件的方法)
1、同传数据一样,在父组件模板文件调用子组件时,定义属性
2、在父组件的ts文件中定义父组件的方法run
run() {
alert('我是父组件的run方法');
}
3、同理在子组件的ts文件中@Input 引入run输入属性,并定义调用方法
import {Component, Input, OnInit} from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {
@Input()
title = '';
@Input() run;
constructor() { }
ngOnInit() {
}
getParentFun() {
// 执行父组件中的run方法
this.run();
}
}
4、子组件模板文件
{{title}}
三、将父组件整个传给子组件
明白了一、二步,这个就很容易理解,在父组件中调用子组件传递属性时,属性值直接传递this即可。
其它步骤就和调用数据和方法的调用方式相同了,这样子组件中的parent属性就代表了父组件实例了,然后随便咋玩。
四、父组件通过@ViewChild主动获取子组件的数据和方法
1、定义子组件的属性及方法:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-footer',
templateUrl: './footer.component.html',
styleUrls: ['./footer.component.css']
})
export class FooterComponent implements OnInit {
constructor() { }
public msg = '我是子组件的msg';
ngOnInit() {
}
run() {
alert('我是子组件的run方法');
}
}
2、父组件模板文件中调用子组件,并设置其id
我是一个新闻组件
3、父组件的控制类中通过@ViewChild 引入子组件对象
import {Component, OnInit, ViewChild} from '@angular/core';
@Component({
selector: 'app-news',
templateUrl: './news.component.html',
styleUrls: ['./news.component.css']
})
export class NewsComponent implements OnInit {
constructor() { }
@ViewChild('footer') footerEl: any; // 获取子组件
ngOnInit() {
}
// 获取子组件的属性
getChildMsg() {
alert(this.footerEl.msg);
}
// 执行子组件的方法
getChildRun() {
this.footerEl.run();
}
}
四、子组件通过@Output触发父组件的方法
1、子组件中引入Output和EventEmiter
import {Component, EventEmitter, OnInit, Output} from '@angular/core';
2、子组件中实例化EventEmiter
@Output() private outer = new EventEmitter();
3、子组件通过EventEmiter 对象outer实例广播数据
callParentFun() {
const object: any = new Object();
object.aa = 'aa';
object.bb = 'bb';
this.outer.emit(object);
}
4、父组件调用子组件的时候,定义接收事件 outer就是子组件的EventEmiter对象outer
5、父组件接收到数据会调用自己的formChild方法,这个时候父组件就能拿到子组件的数据
formChild(e) {
console.log(e);
alert(e.aa);
}