Вопрос об обновлении данных сервиса прямо в компоненте - PullRequest
0 голосов
/ 10 июля 2019

У меня есть эта услуга:

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 компонент вносит изменения в свою копию, это все равно не повлияет на другие компоненты? Конечно, данные в сервисе не пострадают. Я чувствую, что я не делаю что-то правильно здесь, но не могу понять, что это такое. Я провел много исследований и не могу найти четкого ответа относительно того, что является лучшей практикой здесь. Должен ли я предоставить наблюдаемый для массива объектов здесь?

РЕДАКТИРОВАТЬ: Может быть, ответ заключается в том, что компоненты должны иметь свою собственную копию данных, и если они обновляют ее, то это нормально? Это просто означает, что он не будет обновляться через сервис. Я думаю, я просто беспокоюсь о том, чтобы несколько копий данных перемещались и в конечном итоге вызывали ошибки.

...