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