<app-life [parentValue]="parentValue" #lifeComponent></app-life>
import {Component} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
public parentValue: string = 'parentValue'
}
import {Component, Input} from '@angular/core';
@Component({
selector: 'app-life',
templateUrl: './life.component.html',
styleUrls: ['./life.component.scss']
})
export class LifeComponent {
@Input() parentValue: string;
}
<p>子组件接受父组件的传值:{{ parentValue }}</p>
父组件:
<app-life [parentValue]="parentValue" #lifeComponent></app-life>
<button (click)="getSonValue()">getSonValue</button>
import {Component, ViewChild} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
public parentValue: string = 'parentValue'
@ViewChild('lifeComponent') lifeComponent: any
getSonValue() {
alert(this.lifeComponent.userName)
}
}
子组件:
import {Component, Input} from '@angular/core';
@Component({
selector: 'app-life',
templateUrl: './life.component.html',
styleUrls: ['./life.component.scss']
})
export class LifeComponent {
public userName: string = 'sonValue'
}
Angular的Output属性是用于子组件向父组件传递信息的一种方式。通过在子组件中定义一个Output属性,子组件可以通过EventEmitter触发这个属性,父组件可以通过@Output的形式监听子组件的属性,并在属性被触发时调用相应的方法。
在子组件中定义Output属性和触发事件的方法。
<button (click)="toParentValue()">toParentValue</button>
import {Component, EventEmitter, Output} from '@angular/core';
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent {
@Output() public outter = new EventEmitter()
toParentValue() {
this.outter.emit("i am sonValue")
}
}
在上面的例子中,我们定义了一个名为outter 的Output属性,并在按钮的点击事件中通过EventEmitter触发了这个属性,并向父组件传递了一个字符串 i am sonValue 。
在父组件中引入子组件,并在模板中使用@Output装饰器监听子组件的Output属性。
<app-header (outter)="getValueBySonComponent($event)"></app-header>
import {Component} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
public parentValue: string = 'parentValue'
getValueBySonComponent(e: any) {
console.log(e);
}
}
组件间共享一个service服务,那么组件之间就可以通过service实现通信。示例中我们使用rxjs中的BehaviorSubject,它是Subject的一种变体,可以存储最后一条数据或者初始默认值,并会在订阅时发送其当前值。您可以通过RxJS官网进行了解,当然通过文中的说明,您还是可以了解其具体实现的功能。
服务:TransValueService
import {Injectable} from '@angular/core';
import { BehaviorSubject} from "rxjs";
@Injectable({
providedIn: 'root'
})
export class TransValueService {
public subject: BehaviorSubject<any> = new BehaviorSubject<any>(0);
constructor() {
}
}
两个组件:HeaderComponent AppComponent
HeaderComponent 如下所示:
<p>app-header接收到的数据:{{ data }}</p>
<button (click)="updateDataFromAppHeader()">app-header发送数据</button>
import {Component, OnDestroy} from '@angular/core';
import {TransValueService} from "../../services/trans-value.service";
import {Subscription} from "rxjs";
@Component({
selector: 'app-header',
templateUrl: './header.component.html',
styleUrls: ['./header.component.scss']
})
export class HeaderComponent implements OnDestroy {
public subscription: Subscription
public data: string = ''
constructor(public TransValueService: TransValueService) {
this.subscription = this.TransValueService.subject.subscribe(data => this.data = data)
}
updateDataFromAppHeader() {
let _data = this.data
_data += '_zhaoshuai-lc'
this.TransValueService.subject.next(_data)
}
ngOnDestroy(): void {
this.subscription.unsubscribe();
}
}
AppComponent 如下所示:
app-component组件发送数据:<input type="text" name="inputValue" [(ngModel)]="inputValue"> <button (click)="send()">发送</button>
<app-header></app-header>
import {Component} from '@angular/core';
import {TransValueService} from "./services/trans-value.service";
import {Subscription} from "rxjs";
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
public inputValue: string = ''
public subscription: Subscription
constructor(public TransValueService: TransValueService) {
this.subscription = this.TransValueService.subject.subscribe(data => this.inputValue = data)
}
send() {
this.TransValueService.subject.next(this.inputValue)
}
}