Я изучаю NGXS
с помощью плагина Emitters
в Angular
, и у меня возникли некоторые проблемы с пониманием того, как декларировать мои файлы состояния управляемым способом.
Я успешно объявил простой файл .state следующим образом:
export type PageStatusCases = 'LOADING' | 'IDLE' | 'ERROR' | 'INITIALIZING';
export interface AppStateModel {
pageStatus: PageStatusCases;
}
@State<AppStateModel>({
name: 'AppState',
defaults: {
pageStatus: 'INITIALIZING'
}
})
export class AppState {
@Selector()
static pageStatus(state: AppStateModel): PageStatusCases {
return state.pageStatus;
}
@Receiver({type: '[Global] Page status'})
static setPageStatus({patchState}: StateContext<AppStateModel>, {payload}: EmitterAction<PageStatusCases>): void {
patchState({pageStatus: payload});
}
}
Теперь я пытаюсь более сложный пример преобразования моего Service
в State
В моем сервисе у меня много BehaviorSubject
отслеживающих состояние моего пользовательского интерфейса.
title: BehaviorSubject<string> = new BehaviorSubject('');
backClick$: EventEmitter<void> = new EventEmitter<void>();
primaryClick$: EventEmitter<void> = new EventEmitter<void>();
toolbarVisible$: BehaviorSubject<boolean> = new BehaviorSubject(true);
primaryVisible$: BehaviorSubject<boolean> = new BehaviorSubject(false);
primaryDisabled$: BehaviorSubject<boolean> = new BehaviorSubject(false);
primaryAutoDisabled$: BehaviorSubject<boolean> = new BehaviorSubject(false);
primaryIcon$: BehaviorSubject<ToolbarPrimaryIcon> = new BehaviorSubject(ToolbarPrimaryIcon.ADD);
Я начал преобразовывать свои BehaviorSubject
в части штата, но я понял, что мне нужно создать много стандартного кода.
За каждые BehaviorSubject
мне нужно:
- Объявите это в государственной модели
Interface
- Объявить состояние по умолчанию в
State
- Объявить, что
@Selector
в состоянии "манифест"
- Объявить, что
@Receiver
(Action
) в состоянии
- Объявите, что
@Select
в каждом компоненте, который нуждается в этом
- Объявите, что это
@Emitter
в каждом компоненте, который нуждается в этом, для того, когда я хочу обновить его
Моя текущая ситуация - более 100 строк кода для правильного управления состоянием только 7 переменных, поэтому я думаю, что что-то упустил. Я даже не жалуюсь на количество добавленного визуального шума.
Очевидно, что что-то не так
Я хотел бы знать, что мне не хватает, и что было бы лучшим способом объявить состояние в такой ситуации.
Я использую NGXS с плагином emitters
, потому что я через него собирался уменьшить количество шаблонов, но на данный момент я не набираю много.