所以我有一个相对较大的应用程序,它具有延迟加载的功能模块,并且在这些模块中有一系列处理特定数据结构的组件,例如:
/thing/123/profile
/thing/123/subscriptions
/thing/123/history
这些组件使用解析防护来确保url中引用的数据ID(123
)将适当的数据结构加载到管理thing
服务中。解除保护优先使用此服务数据以避免在兄弟路由导航上重复查看数据,并且组件(profile
,subscriptions
,history
)仅使用来自thing
的{{1}}服务,仍然不知道解决方案的确保数据已被加载的努力。如果数据已加载到服务中,则resolve将使用该数据,如果没有,则在路由解析期间查找它。
听起来不错,对吗?在角度2.0.X的某处,解决方案在路由解析期间停止使用数据更新服务。
如果我在各个组件中使用ActivatedRoute.data.forEach()
' OnInit
,我可以看到解决方案确实加载了数据,此时我可以将其重新映射回服务,但是我试图避免重新实施路由数据检查在每个子组件上,特别是因为在大多数情况下(兄弟导航),数据已经在服务上设置。解决保护是可以从thing
服务中观察到的,它可以设置自己的数据成员。在observable运行时,在服务中,值被适当地设置。它适当地解析为路线数据。然而,当路线加载时,这些数据已从服务中消失......
这只是加载完整网址时的问题,例如在最终路线上刷新,解决方案必须重新加载数据 - 如果它在导航到路线之前在服务中,那很好。
我可以稍后用一个简单的例子组合一个plunkr,没有时间从现在的实际应用程序中削减它,但只是想知道是否有人看到过这种行为或者知道为什么会发生这种情况的原因(对于路由解析而在基础应用程序中注入的服务有一些范围问题,但是一旦加载了路由,就会出现在功能模块中)或者这是否是意外行为?
tl; dr - 为什么我的服务在路由解析期间正确设置了一个属性,但是一旦路由实际加载,该属性就会被取消?这不是一个功能模块所独有的,但在我的整个应用程序中是一致的,破坏了我将路由参数解析抽象为服务的能力,使得组件不知道查找。提前谢谢!
答案 0 :(得分:1)
我想我看起来不够努力。路由器@ ^ 3.2.0的已知问题,它实例化提供程序两次。解决方案是临时降级路由器直到修复。
感谢@Fredrik Lundin建议重新创建服务,该服务确实在路由解析后重新创建。