我的父组件有一个子组件:Child0 和 Display。
Child 0 有一个按钮,用于打开一个模式,用户可以在其中从列表中选择项目。显示组件只有一个标签和一些文本。
用户界面流程:
所选数据存储在服务中。
我在显示组件中显示数据时遇到问题。当我查看其中选定的数据时,ngOnInit它是空的,因为用户尚未选择任何内容。当选定的数据发生变化时,如何更新该组件?
主要应用程序组件
<div class="row">
<child0-app (onSelectedData)="getSelectedData($event)" [dataForm]="dataForm"></child0-app>
</div>
<div class="row">
<app-display></app-display>
</div>
Run Code Online (Sandbox Code Playgroud)
我的服务
public getSelectedData() {
return this.selectedData;
}
public setSelectedData(selectedData: any[]) {
this.selectedData = selectedData;
}
Run Code Online (Sandbox Code Playgroud)
网格组件
getCheckedItemList() {
this.checkedList = [];
for (let i = 0; i < this.data.length; i++) {
if (this.data[i].isSelected) {
this.checkedList.push(this.data[i].Name);
}
}
this.appService.setSelectedData(this.checkedList);
}
Run Code Online (Sandbox Code Playgroud)
显示组件
constructor(private service: AppService) {
this.selectedData = this.service.getSelectedData();
}
Run Code Online (Sandbox Code Playgroud)
---更新答案---
感谢@Vlad 帮助我解决这个问题。
对于访问此帖子的其他人。我使用下面的代码来订阅和取消订阅
private subscription: Subscription = new Subscription();
ngOnInit () {
this.subscription.add(
this.appService.selectedDataObservable.subscribe(selectedData => {
console.log(selectedData);
}));
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
Run Code Online (Sandbox Code Playgroud)
我已更新示例以使用Angular 文档中的“父级和子级通过服务进行通信”模式。
简而言之,您需要某种方式来“侦听”服务中数据的更改。Angular 包含了针对这种情况的 RxJS 库。因此,您需要创建一个Subject用于发出新值的对象和一个Observable用于监听更改的对象。
粗略地说,您最终会得到如下服务:
@Injectable({
providedIn: "root"
})
export class DataService {
private dataSubject = new BehaviorSubject<any>(null);
public dataObservable = dataSubject.asObservable();
public setData(data: any) {
this.dataSubject.next(data);
}
}
Run Code Online (Sandbox Code Playgroud)
其他组件可以通过以下方式“发送”数据:
this.dataService.setData(newData);
Run Code Online (Sandbox Code Playgroud)
并通过以下方式获取/监听新数据:
this.dataService.dataObservable.subscribe(newData => {
// Do Stuff
});
Run Code Online (Sandbox Code Playgroud)
因为这使用BehaviorSubject存储“当前值”的 ,所以任何新订阅者将立即使用现有值运行并侦听未来的更改。
注意事项:
takeUntil中的方法。