【问题标题】:Selector for NgRx root storeNgRx 根存储的选择器
【发布时间】: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


【解决方案1】:

但是在根存储上使用Feature store的方法似乎很奇怪。

我很困惑,但featureSelector 并没有真正绑定到功能,它只是从根对象中选择一个切片。这是const selectSecurity = (state) =&gt; state.security 的语法糖。

我目前倾向于使用(以降低复杂性)只是使用StoreModule.forRoot({}) 创建商店但不注册任何reducer。 要注册减速器,我使用StoreModule.forFeature('security', securityReducer)。 根据我的经验,这种设置对大多数开发人员来说会减少摩擦。两种设置的结果是相等的。

【讨论】:

  • 我不知道您使用的是哪个版本的 NgRx(我的是 9.2),但声明: const selectSecurity = createSelector((state) => state.security) 因为没有可用的重载。它需要 2 - 9 个参数。这是我第一次尝试寻找合适的选择器。
  • 这种情况下不需要使用createSelector,只需:const selectSecurity = (state: MyState) =&gt; state.security
  • 这仍然不对... state.security 既不是 TokenState 也不是 Keyring 接口的一部分。
  • 它是全局状态对象的一部分。如果您没有它的类型,则必须创建一个或将其键入为 any
猜你喜欢
  • 1970-01-01
  • 2021-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 2022-04-21
  • 2022-08-18
  • 2020-05-22
  • 2019-01-21
相关资源
最近更新 更多