2016-04-29 77 views
9

我只是圍繞角2來看我的頭,並正在設計一個嚮導類型的應用程序。第1頁上的組件需要將數據傳送到其他頁面上的組件。考慮使用服務來保存在嚮導的下一個視圖/組件中注入的狀態/數據。整個事情應該鬆散耦合。我不認爲設計一個可觀察的模式是有用的,因爲在下一個頁面/視圖之一上的組件是不可見的。角2中有哪些新功能可以用來解決這個問題?如何保持角2的狀態?

+0

請添加一些代碼演示您嘗試完成的任務。 Angular提供'@Input()','@Output()'用於父子關係(某種程度上用於兄弟),以及用於所有其他服務。 –

+0

舊的好的路由參數是從一條路徑傳遞到另一條路由的嗎? – smnbbrv

+0

您可以使用帶有RxJS行爲副本的服務來確保尚未顯示的組件在初始化時獲取最新數據。 https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/subjects/behaviorsubject.md – Harry

回答

7

我建議保持你的狀態集中使用例如Redux。然後,您將使用角的@Input()和@Output()將狀態傳播到組件,並從組件中分派狀態更改。

您將擁有一個訂閱狀態更改的頂級組件,並使用子組件@Inputs傳播這些組件。您的子組件會使用@Outputs()向頂層組件發出狀態更改請求,然後更新中央狀態。

通過這種方式,您的單個組件不必知道有關狀態如何存儲和更新的任何信息,它們僅提供功能並接受對其功能具有預期效果的輸入參數。

如果您有許多深度嵌套的組件,它們本身也使用@Input()和@Output()來提供功能,並且不直接與任何狀態存儲進行通信。

我自己使用這種方法,它使每個組件都非常精簡併且可重用,同時使它非常容易跟蹤您的狀態,並降低了跨組件同步狀態的複雜性。

您還應該看看ChangeDetectionStrategy和ChangeDetectorRef,因爲您可以使用此方法簡化組件更改檢測。您的所有子組件通常都可以使用所謂的OnPush檢查策略,這意味着它們的更改檢測將僅在其@Input()屬性發生更改時才運行。由於這是在這種情況下狀態將會改變的唯一方式,所以您可以通過角度來說明,否則就不會檢查更改。這也將有助於提高性能。

請注意,您可以只使用常規的angular2服務來保持狀態,但像Redux這樣的東西可以免費提供一些東西,例如提供的開發工具。如果你使用Redux,也可以看看Immutable.js,因爲重要的是不要直接使用Redux來改變狀態。通過終極版的Angular2啓發

+0

謝謝,這是一個不錯的方法!如果是深度嵌套的子組件,那麼如何將狀態更改一直返回到保存視圖/應用程序的「主」狀態的頂級組件?你有一連串的輸出到頂端,還是有一個可以繞過這些鏈條的捷徑? – Janne

+1

通常你會有一連串的輸出到最上面。如果它的嵌套方式過於舒適,可能需要將頂層組件的責任分解爲多個組件,這些組件正在操縱和訂閱中央集權狀態的不同區域。 – jgranstrom

+1

我還沒有完全掌握最佳做法和/或角度「希望」我這樣做的方式。在大多數情況下,我一直依賴大量的輸入輸出,但最近我意識到我可以將一些屬性添加到服務中,並將其注入到我需要保存狀態的組件中。服務本質上是更「集中的存儲」 - 也許這就是Redux的做法,只是方法更復雜?或沒有?我的方法使用服務並依賴DI而不是大量的In/Out有任何問題。我發現注入服務更容易。 – JzInqXc9Dg