我有一个包含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我在其视图中的其他组件中触发订阅。因为现在它们似乎都编辑了同一个对象,因为服务返回一个引用。
我怎样才能最简单地实现这种行为/模式? 我是否应该深入克服组件中服务的每个响应?
溴
答案 0 :(得分:1)
当然。此行为是因为您正在使用热门主题,并且所有订阅者在更改时都会收到通知。这是主题性质。
如果您只想影响一个组件,那么您有两个解决方案: 1)使用可观察而不是主题 2)或为每个组件创建一个服务(使用@ component.providers属性),但这是一个非常糟糕的做法。