我正在 Nx 工作区中使用 Angular 5 和 @ngrx/store 开发企业应用程序。
我们的应用程序的要求之一是支持打开多个选项卡——这意味着从我们的侧菜单中,用户可以选择多个功能或相同的功能,并在我们的应用程序的单独选项卡中打开它们。我们需要能够分离这些选项卡的状态,因为用户可以在应该完全分开的多个选项卡中打开相同类型的搜索。例如,他们可以打开一个帐户搜索选项卡并按帐户 ID 123456 进行搜索,然后在另一个帐户搜索选项卡上搜索 234567。显然我们不希望一个选项卡中的状态与另一个选项卡发生冲突。
我不确定最好的方法是什么。我们的帐户搜索子功能的示例状态类似于
libs/accounts/src/search/+state/search.reducer.ts
export interface AccountSearchState {
accounts: { [id: string]: Account };
metadata: Metadata;
ids: string[];
loading: boolean;
query: AccountQuery;
...
}
它上面有一个顶级功能状态,例如:
libs/accounts/src/+state/index.ts
export interface AccountState {
search: fromSearch.AccountSearchState
...
}
我能想到的一种解决方案是将上述子功能状态存储在选项卡 ID 下。
libs/accounts/src/search/+state/search.reducer.ts
export interface AccountSearchState {
states: { [id: string]: SubState }
}
libs/accounts/src/+state/index.ts
export interface AccountState {
search: fromSearch.AccountSearchState
tab: fromTabs.TabState
...
}
.. 这将需要一个单独的 TabState 可以在我们所有的功能模块中使用,并且至少包含以下内容:
libs/tabs/src/+state/index.ts
export interface TabState {
selectedId: string;
}
然后我们可以创建使用这两种状态的选择器:
libs/accounts/src/+state/index.ts
export const getAccountState = createFeatureSelector<AccountState>('account');
export const getTabState = createSelector(getAccountState, (state: AccountState) => state.tab);
export const getAccountSearchState = createSelector(getAccountState, (state: AccountState) => state.search);
export const getAccounts = createSelector(getTabState, getAccountSearchState, (tab, search) => search.states[tab.selectedId].accounts);
当用户单击不同的选项卡时,我们必须发出一个会更改所选选项卡 ID 的事件,这需要通过让每个功能中的选项卡缩减器查找操作并更新功能状态来处理,以便它知道当前的选项卡。这意味着对于我们所有的功能,我们都需要有这种结构——当我真的想以某种方式抽象出来的时候。我只是不确定如何做到这一点。我也不想将选定的选项卡 ID 存储在每个功能存储中 - 相反它将处于根状态,但我不完全确定如何将该值传递给功能状态以返回正确的数据。
任何人都有更好的方法来解决这个问题?
谢谢,
担