Angular 在组件之间共享数据服务

Angular 在组件之间共享数据服务,angular,angular-services,Angular,Angular Services,我是新手,有个问题。我有两个组件A和B以及SharedDataService。 在组件A中,我从REST服务获取数据,为了与组件B共享这些数据,我想使用SharedDataService A部分: let data: Data; this.restService.getData().subscribe(data => { this.sharedService.addSharedData(data); } , error =&

我是新手,有个问题。我有两个组件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);
和共享服务:

public sharedData: Data;

  constructor() { }

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

  getSharedData() : Observable<Data> {
    return of (this.sharedData);
  }
公共共享数据:数据;
构造函数(){}
addSharedData(数据:数据){
this.sharedData=数据;
}
getSharedData():可观察{
归还(本.共享数据);
}
在调试期间,我发现组件B试图比组件A早几次获取数据。它是如何工作的?我认为subcribe总是在数据发生变化时获取数据。但为什么现在它不起作用


另外,共享数据效果很好。例如,如果我把这个.sharedService.addSharedData(fakedata)放在下面,它就会工作;在组件A中重新订阅服务之前

修改您的
共享服务
,以利用
行为主体
和反应式编程的威力

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

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

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

private-sharedData:BehaviorSubject=new-BehaviorSubject(null);
addSharedData(数据:数据){
this.sharedData.next(数据);
}
getSharedData():可观察{
返回此.sharedData.asObservable();
}
通过这种方式,
SharedService
将无缝跟踪您的数据,并在新值到达时通知所有
getSharedData()
订阅
addSharedData(数据:数据)


另外,通过使用
BehaviorSubject
而不是
Subject
,任何新订阅都将收到上一次的数据。但请注意,在使用
addSharedData
方法
getSharedData
到达某些数据之前,将提供空值。

修改您的
共享服务
以利用
行为主体
和反应式编程的功能

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

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

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

private-sharedData:BehaviorSubject=new-BehaviorSubject(null);
addSharedData(数据:数据){
this.sharedData.next(数据);
}
getSharedData():可观察{
返回此.sharedData.asObservable();
}
通过这种方式,
SharedService
将无缝跟踪您的数据,并在新值到达时通知所有
getSharedData()
订阅
addSharedData(数据:数据)


另外,通过使用
BehaviorSubject
而不是
Subject
,任何新订阅都将收到上一次的数据。但请注意,在使用
addSharedData
方法
getSharedData
到达某些数据之前,将提供空值。

尝试使用来自服务的模板(html)中相同的可观察数据,使用模板中的纯管道来显示它们。尝试使用来自服务的模板(html)中相同的可观察数据,在模板中使用纯管道来显示它们。同样的问题。我想这是因为addSharedData方法中的数据没有改变,我更新了我的答案。当我们使用
主题时
新订阅将不会收到任何以前的数据
BehaviorSubject
解决了这个问题。同样的问题。我想这是因为addSharedData方法中的数据没有改变,我更新了我的答案。当我们使用
主题时
新订阅将不会收到任何以前的数据
BehaviorSubject
解决了这个问题。