【发布时间】:2020-07-18 17:49:02
【问题描述】:
这是我第一次接触 NgRx 商店,所以准备好接受新手问题...
到目前为止,我所做的一切都有效,但我的代码的一部分似乎并不“正确”。
我的商店是用 2 个接口 (token.model.ts) 构建的:
export interface Keyring {
jwt: string;
status: string;
}
export interface TokenState {
readonly keyring: Keyring;
}
商店位于应用的根目录 (app.module.ts):
...
StoreModule.forRoot({ security: keyringReducer }),
...
请注意地图中的名称...安全
我用来在我的组件中访问我的商店的选择器是这样的,它可以工作:
this.token$ = store.select<any>((state: any) => state.security.keyring.jwt);
现在,这是感觉不对的地方,因为没有任何类型,我想用“干净”选择器替换它。所以它尝试了这个:
const selectState = (state: TokenState) => state.keyring;
export const selectJwt = createSelector(
selectState,
(state: Keyring) => state.jwt
);
...
this.token$ = store.select(selectJwt);
当然,这不起作用(状态未定义)!而且我可以看到为什么等式中缺少“安全”对象,但是我找不到将其包含在选择器声明中的方法。它不是我界面的一部分,只是我商店注册中的文字。
所以,我的问题是:访问根存储的正确选择器是什么???
谢谢!
更新
这是我可以使用 createFeatureSelector 做的最好的事情,即使商店是 forRoot:
const selectStore = createFeatureSelector<TokenState>('security');
export const selectJwt = createSelector(
selectStore,
(state: TokenState) => state.keyring.jwt
);
【问题讨论】:
-
Hmm.. 我使用 featureSelector 来获取根状态..?
-
@MikeOne :我试过了,它有效。但是在根存储上使用 Feature store 的方法似乎很奇怪。也许这就是要走的路,文档对那部分真的不清楚。所以这将起作用: const test = createFeatureSelector
('security');并导出 const selectJwt = createSelector(test,(state: TokenState) => state.keyring.jwt); ...但我仍然想知道这是否是“正确”的做法?
标签: angular typescript ngrx ngrx-store