2017-03-03 60 views
1

所以我有延迟加载功能模块比较大的应用程序,这些模块中的一系列组件,这些组件在一个特定的数据结构的工作,如:angular2组服务属性

/thing/123/profile /thing/123/subscriptions /thing/123/history

这些组件使用解析防护来确保url中引用的数据ID(123)将适当的数据结构加载到管理的thing服务中。解析警卫优先使用这个服务数据以避免在兄弟路线导航上重复地查看数据,并且组件(profile,subscriptions,history)仅仅使用来自服务的thing,仍然不知道解决者的努力确保数据具有已加载。如果数据在服务中加载,则解决使用该数据,如果不使用,则在路由解析期间查找数据。

听起来不错,对吗?以及围绕角2.0.X的地方,解析警卫停止在路由解析期间用数据更新服务。

如果我在个别组件OnInit中使用ActivatedRoute.data.forEach(),我可以看到解析警卫确实加载了数据,并且此时我可以将其重新映射回服务,但是我试图避免重新实现每个子组件上的路由数据检查,特别是由于在大多数情况下(同级导航)数据已经在服务上设置。解决后卫是一个可以从thing服务中观察到的服务,它设置了自己的数据成员。在observable运行时的服务中,值被适当地设置。它将适当地解析为路由数据。然而这些数据在路由加载时从服务中消失了...

这只是加载完整网址时的一个问题,例如,在最后的路线上进行刷新,其中决心必须加载新的数据 - 如果它在导航到路线之前在服务中,则没有问题。

我可以用一个简单的例子来组装一个plunkr,没有时间从现在的应用程序中删除它,但只是想知道是否有人看到了这种行为或知道这种情况发生的原因(为了路由解析而在基本应用程序中注入的服务的一些范围问题,但是在路径加载后的特征模块中等)或者这是意外行为?

tl; dr - 为什么我的服务在路由解析过程中正确设置了自己的属性,但是一旦路径实际加载后,该属性是未设置的?这不是一个功能模块所特有的,而是与整个应用程序一致,破坏了我将路由参数解析抽象为服务而使组件无法查找的功能。提前致谢!

+1

它可能是与在那里你提供服务?解决的路线数据首次设置后,是否可能在某处进行了重新初始化? –

+1

@Fredrik - 这是一个很好的想法,我会跟踪服务构造函数,看看它是否在某个时刻被重新创建,尽管我不明白它为什么会这样 - 它只提供一次,由它服务的特性模块提供 – derelict

回答

1

我想我看起来不够硬。路由器@^3.2.0的一个已知问题,它将实例化提供程序两次。解决方案是暂时降级路由器直到修复。

对@Fredrik Lundin的建议重建服务的荣誉,该服务确实正在路线解决后重新创建。

https://github.com/angular/angular/issues/12869