2017-03-03 90 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