角度可观察数据未在组件初始化时加载

Imr*_*med 1 angular

我有一个数据服务,用于在组件中加载数据,如下所示:

this.dataService.getUserData().subscribe(user => {
    this.user = user;
});
Run Code Online (Sandbox Code Playgroud)

现在,当数据出现时pushed/set(像这样this.dataService.setUser(user);),它会很好地更新组件中的数据!

但是,如果我的组件由于某种原因隐藏然后再次显示,则组件会再次初始化,并且服务也在 init 上成功订阅,但当前数据不会加载到我的组件的user对象中,直到对数据调用下一次推送/设置服务。

有没有什么方法可以在 init 时不仅订阅服务,还加载数据服务中的当前数据?

Rak*_*and 5

你应该使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

无论您在何处获取用户数据,都可以像这样调用此服务

this.dataServcie.changeUserData(userData);
Run Code Online (Sandbox Code Playgroud)

当您再次需要这些数据时,只需调用

this.data.tokenInfo.subscribe(userData => {
  if(userData) this.userData = userData;
});
Run Code Online (Sandbox Code Playgroud)

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