强烈建议扁平化 ngrx 商店的状态树,我在整个应用程序中都在努力这样做。我理解并同意这样做背后的原因——扁平状态树更易于管理、深度复制等。
但是,我遇到了一个场景,让我想知道设置状态树的最可维护的方式。我有一个功能,Crews
其中包含一个 Crew 中的许多用户。工作人员的一个实例可以有替代用户(例如,如果该工作人员中的某个人不可用)。Asub
简单地定义了原始用户 ID 和替换用户 ID。据我所知,有两种方法可以做到这一点。最直接的方法是使用非扁平结构——可能看起来像这样:
export interface User {
id: string;
username: string;
}
export interface Crew {
id: string;
members: string[]; //User IDs
subs: [string, string][]; //[Orig UID, Sub UID]
}
export interface UserState extends EntityState<User> { }
export interface CrewState extends EntityState<Crew> { }
export interface AppState {
users: UserState;
crews: CrewState;
}
另一种选择是创建一个Subs
特征,其中的 subsCrew
将指向 subs 中的一个 id:
export interface User {
id: string;
username: string;
}
export interface Crew {
id: string;
members: string[]; //User IDs
subs: string[]; //Sub ID
}
export interface Sub {
id: string;
original: string; //Original UID
sub: string; //Sub UID
}
// Using ngrx entities
export interface UserState extends EntityState<User> { }
export interface CrewState extends EntityState<Crew> { }
export interface SubState extends EntityState<Sub> { }
export interface AppState {
users: UserState;
subs: SubState;
crews: CrewState;
}
但这对我来说似乎有点矫枉过正——创建一个全新的功能,只是为了表示两个字符串 ID 值。任何关于哪个方向最可维护/最直接的想法,或者更好的方式来表示这一点?