基于可观察

时间:2018-05-16 08:51:39

标签: angular rxjs

我有一个包含4个组件的视图。 这4个组件订阅了一个服务,在那里他们获得了他们使用的更新对象。

这是服务:

@Injectable()
export class testService {

  private testSubject = new BehaviorSubject<Test>(null);

  constructor() { }

  public setTest(test: Test) {
    this.testSubject.next(test);
  }

  public getTest(): Observable<Test> {
    return this.testSubject.asObservable();
  }
}

组件订阅如下:

this.testService.getTest()
  .takeUntil(this.unsubscribe)
  .subscribe(
    res => {

      this._test = res;
    },
    err => {
      console.log(err);
    }
  );

问题在于,当我在任何组件中更改_test的任何属性时,我也会对其他组件进行更改。 我希望行为是在该组件中封装更改并通过在testService上调用setTest我在其视图中的其他组件中触发订阅。因为现在它们似乎都编辑了同一个对象,因为服务返回一个引用。

我怎样才能最简单地实现这种行为/模式? 我是否应该深入克服组件中服务的每个响应?

1 个答案:

答案 0 :(得分:1)

当然。此行为是因为您正在使用热门主题,并且所有订阅者在更改时都会收到通知。这是主题性质。

如果您只想影响一个组件,那么您有两个解决方案: 1)使用可观察而不是主题 2)或为每个组件创建一个服务(使用@ component.providers属性),但这是一个非常糟糕的做法。