角度可观察数据未在组件init上加载

时间:2018-02-06 07:17:26

标签: angular

我有一个数据服务,用于在像这样的组件中加载数据:

this.dataService.getUserData().subscribe(user => {
    this.user = user;
});

现在,当数据为pushed/set时(如此this.dataService.setUser(user);),它会更新组件中的数据!

但如果我的组件由于某种原因隐藏然后再次显示,则组件将再次初始化,并且该服务也在init上成功订阅,但当前数据未加载到我的组件user对象,直到在数据服务上调用下一个push / set。

在init上是否存在某种方式,不仅订阅了服务,还加载了数据服务的当前数据?

1 个答案:

答案 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;
});

就是这样,不需要两个组件都是子级父级甚至是任何关系,这是迄今为止在角度组件之间共享数据的最佳方式。