NGXS存储插件和延迟加载状态

时间:2018-08-26 11:59:57

标签: angular ngxs

在我的公司中,我有一个非常复杂的应用程序结构。我们正在使用NX Workspace开发具有共享模块的3个应用程序。

我们的应用程序结构如下所示:apps-> app1-> app2-> app3

libs->具有组件和ngxs状态的身份验证模块->其他具有组件和ngxs状态的共享模块

我们所有的库都被延迟加载到需要它的每个应用程序中。

所以我遇到的问题是ngxs存储插件。似乎必须将其导入每个应用程序模块中,如果您不指定键,则它将每个状态转储到本地或会话存储中(我们正在使用会话存储)。如果不是因为要添加路由器状态,这对我来说也很好。

似乎当路由器状态为会话存储时,当您尝试通过在URL栏中手动键入链接来导航到另一个页面时,它将重定向您回到路由器导航到的上一页。

我到处搜索,似乎每个人都建议您不要将路由器存储在会话存储中。如果还有其他解决方法,请告诉我!

如果没有解决路由器问题的方法,那么这将带我进入下一个问题/问题。我希望能够将状态分别添加到存储中,但我也想将该代码保存在状态所属的模块中,而不是必须将其添加到每个应用程序的AppModule中。我们将拥有一个非常大的应用程序,并且必须在我们每个应用程序中的所有库中映射每个状态。

存储插件没有forFeature选项,但是像我这样的复杂应用程序已经考虑过此选项吗?

我可以在github上提出一个问题,但是想与这里的社区联系,以确保那里没有我遗失的解决方案。

1 个答案:

答案 0 :(得分:0)

  

似乎当路由器状态为会话存储时,当您尝试通过在URL栏中手动键入链接来导航到另一个页面时,它将重定向您回到路由器导航到的上一页。

我在@ngxs/router-plugin@3.2.0上遇到了同样的问题。

  

我到处搜索,似乎每个人都建议您不要将路由器存储在会话存储中。如果还有其他解决方法,请告诉我!

如果路由器未存储在会话对象中,我可以手动导航到其他路由。但是,现在我必须在NgxsStoragePluginModule.forRoot({key: ['auth', 'users', '...']})中分别指定每个状态。

我找到了另一种不使用路由器插件的解决方案。这就需要您设置自己的路由器状态(example,通过angularfirebase):

@Action(Navigate)
  async changeRoute(context: StateContext<string>, action: Navigate) {
    const path = action.payload;
    await this.router.navigate([path]);
    context.setState( path );
  }

现在,我可以通过在网址栏中键入链接来手动导航到任何页面,并且所有状态都存储在会话存储中,包括路由路径。

希望这对您也有用。