Чтобы уменьшить сложность всех состояний в моем приложении, я решил использовать NGXS, потому что он использует способ TypeScript для реализации, который не совсем соответствует архитектуре Angular. Но первая проблема появилась довольно быстро, потому что NGXS не добавляет дополнительный слой восстановителя развязки по сравнению с NGRX.
Каков наилучший способ взаимодействия между несколькими моделями состояний? Предположим, вы хотите манипулировать состоянием B, но для этого действия требуется свойство состояния A. Я нашел концепцию общего состояния в документации, которая может справиться с этим, но это также ограничено, потому что я не могу использовать общее состояние в селекторе для предоставления пользовательскому интерфейсу определенного c выбора, основанного на действии, в котором находятся состояния A и B Требуется.
Например я получил следующие модели, которые представлены в магазине. Проблема в этом примере в том, что это лучший способ получить deviceId
из selectedDevice
из DeviceState
, чтобы использовать его в DeviceHistoryState
, чтобы вернуть все истории элементов выбранного устройства.
Конечно, я мог бы интегрировать DeviceHistory в модель Device, но это не решает проблему выполнения действий между несколькими состояниями. Я также не хочу дублировать selctedDevice в DeviceHistoryStateModel.
export interface Device {
deviceId: string;
// More device details
}
export interface DeviceHistory {
deviceId: string;
itemHistoryMap: Map<number, ItemHistory[]>;
}
export class DeviceStateModel {
devices: Device[];
selectedDevice: Device;
}
@State<DeviceStateModel>({
name: 'devices',
defaults: {
devices: [],
selectedDevice: null
}
})
export class DeviceState {
}
export class DeviceHistoryStateModel {
devicesHistory: DeviceHistory[];
}
@State<DeviceHistoryStateModel>({
name: 'devicesHistory',
defaults: {
devicesHistory: []
}
})
export class DeviceHistoryState {
@Selector()
public static getHistory(state: DeviceHistoryStateModel) {
// ??? Best practise to return all the item histories of the selcted device
}
@Action(GetItemHistory)
public getItemHistory() {
// Stores the item history for the device
}
}