父子组件通讯
非父子组件间变量通讯,可以存入window.localStorage中;
或者定义成服务;
子组件获取父组件变量、方法、父组件对象
- 父组件typescript ```typescript import { Component, OnInit, ViewChild } from ‘@angular/core’;
@Component({ selector: ‘app-news’, templateUrl: ‘./news.component.html’, styleUrls: [‘./news.component.less’] }) export class NewsComponent implements OnInit {
// 定义变量msg、data
public msg:string = ‘父组件msg’; public data:string = ‘父组件data’;
constructor() { }
ngOnInit(): void { }
// 定义方法run
run() { console.log(‘父组件的run方法执行了’); } }
2.配置父组件的html模板```html<!-- 将msg/data变量赋值给子组件的msg/data变量 --><!-- 将父组件的run方法对象赋值给子组件的run变量 --><!-- 将父组件对象本身赋值给子组件的news变量 --><!-- [msg]为子组件定义的@Input();'msg'为父组件的msg变量--><app-header [msg]='msg' [data]='data' [run]='run' [news]='this'></app-header><div></div>
- 在子组件中获取相应变量 ```typescript // 引入Input装饰器 import { Component, OnInit, Input } from ‘@angular/core’;
@Component({ selector: ‘app-header’, templateUrl: ‘./header.component.html’, styleUrls: [‘./header.component.less’] }) export class HeaderComponent implements OnInit {
// 获取父组件传入的内容
@Input() msg:string; @Input() data:string; @Input() news:any; @Input() run:any;
ngAfterViewInit(): void {
// 调用父组件传来的run方法对象this.run();console.log('------------');// 通过传进来的父组件本身调用其run方法this.news.run();
}
}
4.在子组件上展示父组件的变量值```html<div>{{data}}</div><div>{{msg}}</div>
- 可以在setter上添加@Input()截听输入属性值的变化 ```typescript import { Component, Input } from ‘@angular/core’;
@Component({ selector: ‘app-name-child’, template: ‘
“{{name}}”
‘ }) export class NameChildComponent { private _name = ‘’; @Input()
set name(name: string) {
this._name = (name && name.trim()) || ‘
<a name="6a3b6a43"></a>## 在子组件中主动调用父组件方法> 通过@ViewChild可以让父组件主动调用子组件的方法、获取子组件的内容;> 通过@Output()、EventEmitter可以让子组件主动调用父组件的方法,主动广播数据给父组件;1.在子组件typescript中定义要广播的事件变量```typescript// 引入Output、EventMitterimport { Component, OnInit, EventEmitter, Output } from '@angular/core';@Component({selector: 'app-header',templateUrl: './header.component.html',styleUrls: ['./header.component.less']})export class HeaderComponent implements OnInit {// 声明outputdata变量为eventemitter,泛型为emit载荷的类型@Output() outputdata = new EventEmitter<string>();sendParent() {// 向父组件广播数据:'子组件的outputdata传入的数据'this.outputdata.emit('子组件的outputdata传入的数据');}}
- 在子组件html模板中配置按钮触发sendParent方法
<div>这是header子组件</div><button (click)='sendParent()'>调用方法给父组件广播数据</button><hr>
- 在父组件的typescript中配置run方法,用于子组件主动调用 ```typescript import { Component, OnInit} from ‘@angular/core’;
@Component({ selector: ‘app-news’, templateUrl: ‘./news.component.html’, styleUrls: [‘./news.component.less’] }) export class NewsComponent implements OnInit {
// 传入的变量e即为子组件广播给父组件的数据
run(e) { console.log(‘这是父组件的run方法’); console.log(e); } }
4.在父组件html模板中配置子组件和子组件的output```html<!-- outputdata为子组件@Output的变量名,run为父组件的待调用方法,$event为子组件outputdata.emit的广播内容 --><app-header (outputdata)='run($event)'></app-header><div>这是父组件</div>
