【发布时间】:2017-05-07 22:21:01
【问题描述】:
如何在另一个模块中的子路由上激活 RouteGuard 或 Resolve?
示例场景:
我有一个应用程序,它有许多单独的模块,每个模块都定义了自己的路由。考虑定义以下路由的这些模块:
Module1 -> ['/a', '/b', '/c']
Module2 -> ['/d', '/e', '/f']
现在,我需要确保应用程序中的每条路由都具有以下解析:
resolve: { config: AppConfiguration}
我们可以使用:
{ path: '', component: AppComponent, resolve: { config: AppConfiguration} }
然而,这没有任何效果 -/ 执行解析器,但 /a 不执行。
我发现确保路由 /a、/b 和 /c 调用解析器的唯一方法是,如果我将它们设为根的子节点,如下所示:
AppModule -> [ { path: '', component: 'MainComponent', resolver: {..}, children: [
...Module1Routes
...Module2Routes
] ]}
但是这样做意味着应用程序不再按照 Angular 文档推荐的方式构建,RouterModule.forChild() 不再用于其他模块。
我确定这是一个非常常见的用例 - 有没有更好的方法?
【问题讨论】:
-
config 是解析器的原因吗?是否应该在每次路由更改时重新实例化?
-
我有另一种有意义的情况 - 必须更改变量名,因为它是超级机密和东西 :)
-
另外,如果你有它在根目录中,目标是不要在每次路由更改时重新实例化它,而是在加载根目录时加载一次,(即;当我按 F5 或重新启动时应用程序)
-
所以从 /a 到 /b 到 /c 会调用一次解析器,但我仍然可以转到 /c,它会调用解析器。将解析器单独附加到每个路由会调用它 3 次。
-
是的,
children就是这样做的方法。但是,如果您希望它们成为功能模块并使用forChild,那么整个想法就会破裂 - 您将事物与根模块分离,但您尝试通过通用解析器再次耦合它们。没有多大意义。
标签: angular routing angular-routing ng-modules