我有这项服务:
export class MyService {
private mySubject: BehaviorSubject<MyObject[]> = new BehaviorSubject<MyObject[]>([]);
private myObjs: MyObject[] = [];
constructor(private http: HttpClient) { }
get myObjs$() {
return this.mySubject.asObservable();
}
getObjects() {
const mock = new MockObjects();
this.mats = mock.getMockObjs();
this._notify();
}
clearSelections() {
this.myObjs.forEach((obj) => {
obj.added = false;
});
this._notify();
}
private _notify() {
// Deep clone the array in order to keep the source data immutable.
const objs = this.myObjs.map((obj) => ({ ...obj }));
this.mySubject.next(objs);
}
}
我要实现的目标是为MyObjects数组提供可观察的结果。我这样做是为了将所有这些内容轻松显示在一个组件中。同时,我只希望该服务有权访问任何MyObject的更新数据。但是我不知道如果我向每个订阅者提供MyObjects数组,该如何执行。例如,如果MyObject有一个名为添加的属性,则我不希望组件直接更新添加的属性。该服务应具有一个设置器,用于更新1个MyObject的添加值,然后将新值推送到所有组件。
所以我的问题是……是什么阻止了组件之一直接在组件中更改MyObject实例之一?即使我在从服务中推送新值之前创建了数组和对象的深层克隆,如果1个组件对其副本进行了更改,它是否还会影响其他组件?当然,服务中的数据不会受到影响。我觉得我在这里做的事情不正确,但无法弄清楚它是什么。我已经进行了大量研究,但就目前的最佳实践而言,找不到明确的答案。我应该在此处为一组对象提供可观察的东西吗?
编辑:也许答案是组件应该具有自己的数据副本,如果它们进行了更新,那还可以吗?这只是意味着不会通过该服务进行更新。我想我只是担心要浮动多个数据副本并最终导致错误。