将全局信息存储在@ngrx中,并注入到服务/拦截器中

时间:2019-05-15 20:13:40

标签: angular ngrx

我有一个带有全局@ngrx存储(AppState)和一些功能存储(例如DashboardManagerState)的Angular 7应用程序,这些存储被延迟加载了它们的相应模块。全局存储区包含有关已登录用户的信息,例如ID和用于向我们的后端发出http请求的令牌。

我还创建了一个拦截器,将令牌添加到请求中,其他一些服务在请求中使用了代理ID。将这些信息存储在Redux中,无需不断传递这些信息或将其存储为cookie。

虽然我已经做好了这项工作,但是我很确定我已经以一种骇人听闻的方式进行了研究,并且我正在寻求解决这个问题。

我已经通过在令牌拦截器中使用此构造函数注入应用程序状态来使应用程序正常工作。

constructor(private store: Store<{ state: AppState }>) {}

我确定那是不正确的。我尝试使用选择器,但通过该构造函数传入的对象将我的存储作为参数而不是基础存储。看起来像这样

{
 state: AppState,
 dashboardManagerState: DashboardManagerState
}

因此选择器无法正常运行。

我已经可以将全局状态添加到功能状态中,但是我应该向令牌拦截器注入什么类?没有合适的选择,因为此服务必须是应用程序的全局服务。

理想情况下,我将能够使用Angular的DI注入状态,因此我可以将上述构造函数用作constructor(private store: Store<AppState>) {},并且当我想要特征状态时也可以使用类似的方法:constructor(private store: Store<DashboardManagerState>) {}。我敢肯定这是不正确的,但是我不知道处理这种情况的正确方法。

我该如何在注入根的服务中引用我的全局状态?

1 个答案:

答案 0 :(得分:0)

首先,当您注入Store时,将搅动整个商店。例如,如果您将执行Store<DashboardManagerState>,则仍将获得整个商店。键入只是为了使其在组件中是类型安全的。换句话说,在运行时,不管您执行Store<{ state: AppState }>还是Store<DashboardManagerState>

  

我尝试使用选择器,但通过该构造函数进入的对象将我的商店作为参数而不是基础商店

您的选择器可能写错了吗?