Angular 被构建为通过属性(输入)将数据传递给子组件,并通过事件(输出)发送回父组件。
在您的场景中,我看不出有理由不将数据传递给 @Output 属性中的父级:
@Output() test = new EventEmitter<any>();
private sendDataToParent(data:any): void {
this.test.emit(data);
}
<app-child (test)="parentMethod($event)></app-child>
如果您需要扩展有关此主题的知识,您应该阅读此文档:
https://angular.io/guide/component-interaction
无论如何,有时您需要跨多个组件、多个父级或子级的相同数据,您可以使用Observables 来管理此问题,但您应该创建一个服务以注入所有这些组件。
@Injectable()
export class MyDataService {
private dataSubject$: BehaviorSubject<MyData> = new BehaviorSubject<MyData>(null);
getData$(): Observable<MyData> {
return this.dataSubject$;
}
changeData(data: MyData) {
this.dataSubject$.next(data);
}
}
您的组件可以订阅该服务:
export class MyComponent implements OnInit {
public data$: Observable<MyData>;
constructor(private dataService: MyDataService) {
this.data$ = this.dataService.getData$();
}
ngOnInit() {}
changeData(data: MyData) {
this.dataService.changeData(data);
}
}
您可以在您的 html 中使用 data$ 和 async 管道,或者如果您愿意,您可以在代码中手动订阅,但不要忘记在 ngOnDestroy 内取消订阅,这可能是一种方法:
export class MyComponent implements OnInit, OnDestroy {
private destroy$ = new BehaviorSubject<boolean>(false);
constructor(private dataService: MyDataService) {}
ngOnInit() {
this.dataService.getData$()
.pipe(takeUntil(this.detroy$))
.subscribe(data => {
// do x
});
}
ngOnDestroy() {
this.destroy$.next(true);
this.destroy$.unsubscribe();
}
changeData(data: MyData) {
this.dataService.changeData(data);
}
}