Единственный обходной путь, который у нас есть, это клонирование состояния в некоторых наших подписчиках, где мы поддерживаем редакцию, через привязку, как показано ниже:
Не думаю, что смогу ответить, не переписав ваш магазин.
const initialState = {
data: {
id: 1,
description: 'initial'
}
}
Этот объект состояния имеет глубоко структурированные данные. Каждый раз, когда вам нужно изменить состояние, объект должен быть реконструирован.
В качестве альтернативы,
const initialState = {
1: {id: 1, description: 'initial'},
2: {id: 2, description: 'initial'},
3: {id: 3, description: 'initial'},
_index: [1, 2, 3]
};
Это примерно как глубина объекта состояния, который я бы создал. Используйте пару ключ / значение для сопоставления между идентификаторами и значениями объекта. Теперь вы можете легко писать селекторы.
function getById(id: number): Observable<any> {
return subject.pipe(
map(state => state[id]),
distinctUntilChanged()
);
}
function getIds(): Observable<number[]> {
return subject.pipe(
map(state => state._index),
distinctUntilChanged()
);
}
Когда вы хотите изменить объект данных. Вы должны восстановить состояние, а также установить данные.
function append(data: Object) {
const state = subject.value;
subject.next({...state, [data.id]: Object.freeze(data), _index: [...state._index, data.id]});
}
function remove(id: number) {
const state = {...subject.value};
delete state[id];
subject.next({...state, _index: state._index.filter(x => x !== id)});
}
Как только вы это сделаете. Вы должны заморозить нижестоящих потребителей вашего государственного объекта.
const subject = new BehaviorSubject(initialState);
function getStore(): Observable<any> {
return subject.pipe(
map(obj => Object.freeze(obj))
);
}
function getById(id: number): Observable<any> {
return getStore().pipe(
map(state => state[id]),
distinctUntilChanged()
);
}
function getIds(): Observable<number[]> {
return getStore().pipe(
map(state => state._index),
distinctUntilChanged()
);
}
Позже, когда вы делаете что-то вроде этого:
stateFromSubject.data.id = 2;
Вы получите ошибку во время выполнения.
К вашему сведению: Выше написано в TypeScript