我想,這個問題已經在前面討論過了,無論是對於新的RC路由器還是棄用的路由器。最喜歡的解決方案似乎是使用服務將數據傳遞到由router-outlet激活的組件。Angular2 RC1:將數據傳遞到組件
但是,我越想越覺得自己陷入了一種同情,可觀察,甚至是心平氣和的態度。請考慮以下情形:
的路由被稱爲是這樣的:「/車/ 123 /馬達/ 4/sparkcoil」
這意味着:得到火花線圈中的數據與ID 4馬達,這又是ID 123的一部分。
因此,有3個組件具有嵌套路線,「汽車」組件,「電機」組件和「火花線圈」組件。第一個組件有一個路由器插座,在其中呈現子組件。目前爲止並不困難。
讓我們做一些假設:
1) 在「電機」組件,我需要到汽車的數據訪問,並在「火花線圈」組件,我需要同時訪問汽車數據和電機數據。
2)由於數據量龐大,後端調用汽車不包含所有可用電機類型的數據。因此汽車,電機和火花線圈數據必須在單獨的後端調用中獲取。
被激活的第一個組件是路徑「/ car/123」是汽車組件。它有一個服務注入,它使後端調用並返回組件訂閱的Observable。
然後,第二條路線「/電機/ 4」被激活。我需要知道由父組件獲取的汽車對象。之後,「/ sparkcoil」組件被激活,這也需要了解電機和汽車。顯然,現在還沒有辦法讓@Input裝飾器傳遞它。頻繁的建議是:使用服務。好的,所以我將X服務注入汽車和電機組件。痛苦來了。我沒有找到令人滿意的解決方案來設計這個服務,而沒有發現自己處於一個平行的偶像或可觀察的地獄中。
理念1:
轎廂和對馬達組件調用名爲fetchMotor(ID)和fetchCar(ID)的服務的功能,這反過來,觸發motorFetchedEventEmitter和carFetchedEventEmitter的next()方法。電機和sparkcoil組件訂閱所有事件發送器,以獲取有關後端數據何時被提取的信息。但是,我不知道這些組件在或之前是否訂閱了EventEmitter ,然後被觸發。如果之前,一切都很好,如果之後,我需要「重放」emittals(請參閱Observable.replay(...))。由於服務和它們的EventEmitter只實例化一次,因此重放Observable意味着我可能會收到很多(不相關的)事件。
想法2:
我會這麼做。汽車和電機部件保持空轉,直到火花線圈部件被調用。該組件解析所有路由段,執行相應的後端調用,並通過服務的EventEmitter將後端響應傳播到「car」和「motor」組件。我承認,從RC1開始的新組件路由方面,這種方法相當適得其反。
考慮到生命週期問題,可能有更好的解決方案。根據文檔,OnActivate接口(請參閱https://angular.io/docs/js/latest/api/router/OnActivate-interface.html) 說,當onActivate返回承諾時,所有子組件都不會被激活,直到承諾解決。我不認爲路由組件具有類似的功能。
有沒有人有一個概念如何儘可能優雅地解決這個問題。
感謝您提前提出您的想法。我需要喝杯咖啡! : - ?
嗨Günter, 這是肯定的設計的事情,而不僅僅是一個技術問題。我想,Redux和管理國家的方法並沒有出現。正如你所說的,BehaviorSubject(我猜你的意思是說,而不是BehaviorService)對我的場景來說可能是一個可接受的解決方案。離Angular2上的這篇有趣的文章不遠,並且聲明:https://medium.com/front-end-developers/managing-state-in-angular-2-using-rxjs-b849d6bbd5a5#.hnep5xalp, redux的方向數據流原理。 – Matt
Ops權利,'行爲主體' –