我有一个数据服务,用于在像这样的组件中加载数据:
this.dataService.getUserData().subscribe(user => {
this.user = user;
});
现在,当数据为pushed/set
时(如此this.dataService.setUser(user);
),它会更新组件中的数据!
但如果我的组件由于某种原因隐藏然后再次显示,则组件将再次初始化,并且该服务也在init上成功订阅,但当前数据未加载到我的组件user
对象,直到在数据服务上调用下一个push / set。
在init上是否存在某种方式,不仅订阅了服务,还加载了数据服务的当前数据?
答案 0 :(得分:4)
您应该使用BehaviorSubject
以下是创建服务的方法。
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class DataService {
private userData = new BehaviorSubject<Object>({}); //user proper datatype and format initially for userdata
userDataInfo = this.userData.asObservable();
constructor() { }
changeUserData(userData: any) {
this.userData.next(userData);
}
}
无论您何时获得用户数据,都可以像这样调用此服务
this.dataServcie.changeUserData(userData);
当您再次需要此数据时,请致电
this.data.tokenInfo.subscribe(userData => {
if(userData) this.userData = userData;
});
就是这样,不需要两个组件都是子级父级甚至是任何关系,这是迄今为止在角度组件之间共享数据的最佳方式。