组件之间共享数据服务

时间:2019-06-25 10:02:39

标签: angular angular-services

我是Angular的新手,有问题。我有两个组件A和B。还有SharedDataService。 在组件A中,我从REST服务获取数据,并与组件B共享此数据,我想使用SharedDataService。

组件A:

let data: Data;
this.restService.getData().subscribe(data => 
          {
            this.sharedService.addSharedData(data);
          } , error => console.error(error));

组件B:

let sharedData: Data;
     this.SharedService.getSharedData()
     .subscribe(ds => sharedData = ds);

和SharedService:

public sharedData: Data;

  constructor() { }

  addSharedData(data : Data) {
    this.sharedData = data;
  }

  getSharedData() : Observable<Data> {
    return of (this.sharedData);
  }

在调试过程中,我发现组件B试图比组件A放置数据的时间早几倍。怎么运行的?我认为,如果更改,订阅者总是会获取数据。但是为什么现在不起作用?

P.S。共享数据效果很好。例如,如果我把this.sharedService.addSharedData(fakedata);在组件A中的restService订阅之前

1 个答案:

答案 0 :(得分:2)

修改您的SharedService,以利用BehaviorSubject和反应式编程的强大功能。

  private sharedData: BehaviorSubject<Data> = new BehaviorSubject<Data>(null);

  addSharedData(data: Data) {
    this.sharedData.next(data);
  }

  getSharedData(): Observable<Data> {
    return this.sharedData.asObservable();
  }

通过这种方式SharedService将无缝跟踪您的数据,并在getSharedData()到达一个新值时通知所有addSharedData(data: Data)订阅

也可以使用BehaviorSubject代替Subject,任何新的订阅都将接收到最后的先前数据。但是请注意,在addSharedData方法到达某些数据之前,getSharedData将提供空值。