有关直接在组件中更新服务数据的问题

时间:2019-07-09 23:39:02

标签: angular service state behaviorsubject

我有这项服务:

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个组件对其副本进行了更改,它是否还会影响其他组件?当然,服务中的数据不会受到影响。我觉得我在这里做的事情不正确,但无法弄清楚它是什么。我已经进行了大量研究,但就目前的最佳实践而言,找不到明确的答案。我应该在此处为一组对象提供可观察的东西吗?

编辑:也许答案是组件应该具有自己的数据副本,如果它们进行了更新,那还可以吗?这只是意味着不会通过该服务进行更新。我想我只是担心要浮动多个数据副本并最终导致错误。

0 个答案:

没有答案