- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在 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 - 相反它会处于根状态,但我不完全确定如何将该值传递给功能状态以返回正确的数据。
有人有更好的方法来解决这个问题吗?
谢谢,
丹
最佳答案
我的想法是让选项卡组件向其后代提供自己的商店切片,以便选项卡内的组件可以注入(inject)该切片而不用关心其他选项卡是否存在。
我习惯于通过 ng-app-state
使用 ngrx/store
(我写的),所以我的示例代码将使用它,但它只是 ngrx/store
的包装器,因此您应该能够在没有它的情况下使用相同的概念。
@Injectable()
export class TabStore extends AppStore<TabState> implements OnDestroy {
constructor(store: Store<any>) {
super(store, uniqueId('tabState'), new TabState());
}
ngOnDestroy() {
this.delete(); // when the tab is destroyed, clean up the store
}
}
@Component({providers: [TabStore]})
export class TabComponent {
constructor(tabStore: TabStore) {
// tabStore holds state that is unique to me
}
}
@Component()
export class ChildOfTabComponent {
constructor(tabStore: TabStore) {
// I can also access the same store from descendants
}
}
uniqueId
只有一种方法可以为每个选项卡的状态生成唯一的根级 key 。它在 underscore
, lodash
,就我而言 micro-dash
- 但任何为每个选项卡生成唯一 key 的方法都可以。
关于angular - 如何使用@ngrx/store 通过 ID 存储相同状态的多个版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47599659/
我一直在尝试将 Redux 集成到项目中。 我按照使用示例进行操作,但收到错误store.getState is not a function。 所以我知道其他人也问过类似的问题,但情况略有不同。 R
我正在尝试将我的第一个应用程序上传到 App Store。我已完成 iTunes Connect 所需的所有步骤,我的应用程序状态为“等待上传”。 我相信下一步是使用 Application Load
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
App Store 有所谓的“服务器到服务器”通知。也就是说,当您购买应用内功能时,Apple 服务器会向您服务器的回调方法(发送收据数据)发出 HTTPS 请求。 问题是 - 收据数据中似乎没有用户
我已经将我的第一个应用程序上载到App Store,但是我没有放置我的App需要位置服务和wifi的UIRequiredDeviceCapabilities。结果:该应用程序没有像应做的那样开始寻找坐
由于iOS 8将于本月发布,并且我的应用仅支持32位(因为第3个库仅兼容32位),因此我不确定如果我将新版本的应用提交给我,则该应用的新版本是否会被拒绝App Store将于下个月发布,因为它不支持6
我有一个让我有些困惑的问题。 为了将我的应用提交到App Store,我必须输入Bundle ID后缀。如您所知,Bundle ID会获得Bundle ID后缀的确切名称(您在Bundle ID后缀上
如问题所述,我想知道更新后的应用程序一旦获得批准,是否会自动发布到应用程序商店中? 我的更新已完成并且已经过测试,由于需要几天的时间才能批准,因此我希望现在将其提交批准。同时,我需要在服务器上更改一些
获取应用程序提交到 Apple App Store 的屏幕截图的最简单方法是什么,需要包含的各种尺寸是多少? 另外,是否允许状态栏?我相信我听说它不是,但是包括 Facebook 和 Quora 在内
我在 iTunes 商店中有一个应用程序,其分发证书(在 key 链访问中)将于明天到期。它是一年前生成的,尽管我最近更新了我的 iPhone 开发者计划,但我还没有更新任何证书或签名。 当我将测试设
我的商店包含以下 reducer : export const centralStampState = { layoutState : layoutReducer, //this one is n
我即将将我的应用程序提交到 Apple App Store,并且我了解到 Apple 需要两周时间才能对其进行审核,然后才能上线。但是,在 iTunes Connect 的定价部分,它询问我什么时候发
如果我的应用程序正在接受审核或已获得批准(因此处于 Ready For Sale 状态或同等状态),我可以编辑哪些应用程序信息而无需提交应用程序的新版本? 最佳答案 据此Apple Documenta
我已经在Opera管理控制台上进行了全面检查,看不到他们在哪里提到付款方式。他们说明何时制作,但没有说明。即Paypal,Cheque等。 有人知道他们如何付款吗? 最佳答案 当金额达到200美元时,
我上传了我的二进制文件并创建了屏幕截图。我做的所有屏幕截图都是 640x960,我将它们上传为 PNG。这背后的想法是,我应该以尽可能最好的质量把它交给他们,这样当他们将它们重新压缩成 320x480
我从Microsoft下载了Windows 8 app samples,并下载了这些示例之一加速度传感器示例 我不知道如何测试它以计划使用此功能的软件? 我没有水面设备,想知道只有一种方法可以做到吗?
我正在为TestFlight上传第二个应用程序。第一次进展顺利,但这次却被拒绝了。 We have started the review of your beta app, but we are no
不确定这是正确的论坛,如果不是,我提前道歉。 某处是否有 App Store 新版本的提要?还是带有类别和发布日期的应用提要/列表? 此列表已从 App Store 中消失,我想看看是否可以制作一个应
我有一个 JSON 存储,定义如下 var subAccountStore = new Ext.data.JsonStore({ autoLoad: true, proxy: { ty
我有一个提交到应用商店的应用被拒绝,原因是: 2.30 不符合 Mac OS X 文件系统文档的应用将被拒绝 他们声称我的应用正在修改不受支持的 ~/Library/Preferences/com.a
我是一名优秀的程序员,十分优秀!