注意:爲了簡單起見,考慮部件的深度爲:角2 +/4/5:智能,啞和深深嵌套組件通信
- Smart (grand)parent level 0
- dumb child level 1
....
- dumb grandchild level 2
....)
有多種方案和條件如何智能/隆重/父/子組件在多層(至少3層)鏈上進行通信並傳遞數據。我們希望保留我們的'聰明'(大)父母組件作爲唯一可以訪問我們的數據服務(或原子/不可變的商店)的組件,它將促進與'愚蠢'(大)孩子交換信息。我們看到的選項是:
- 反模式(?):通過@ Input/@輸出綁定將數據傳遞給組件鏈。這就是有些人稱之爲「無關屬性」或「自定義事件冒泡問題」的問題(例如:here和here。)問題。不行。
- 反模式:智能組件通過@ViewChildren或@ContentChilden訪問啞(大)孩子。這再次硬化了孩子們,並且仍然沒有爲(大)孩子們創建一個乾淨的機制來將數據傳遞給智能組件。
- 共享消息服務描述在angular.io食譜here和一個很好的帖子here。
- ?
現在在'3'的情況下,啞(大)孩子必須注入消息服務。這使我想到了我的問題:
問題1:對於每個'愚蠢'(大)孩子來說,注入消息服務似乎很奇怪。對於消息服務來說,最好的做法是爲這個家庭提供一個專門的服務,還是在上面提到的'智能'祖父母的數據服務上捎帶? Q1A:另外,如果所有組件都會注入一個服務,如何比添加@ Input/@ Output綁定更好? (我看到「愚蠢的」組件需要某種方式來獲取信息的觀點)
Q2:如果'聰明'祖父母正在與一個類似redux的商店(我們的ngrx)進行通信怎麼辦?最好通過注入/專用消息服務與「啞」組件進行通信,或者最好是將商店注入每個「啞」組件......或者,注意,除了數據(即將數據添加到/更新存儲或服務)之外,組件間通信是「動作」(例如:表單驗證,禁用按鈕等)的組合。
非常感謝!
感謝您的想法。請注意,再次就解耦問題而言,海事組織除了提供間接服務是其主要職責之外,頂級部門不應該真正關心或瞭解其孫輩。順便說一句,這與我原來的問題中的選項'2'沒有太大差別。 – MoMo
不客氣。我想我明白你的意思了 - 頂層父組件現在不僅需要知道子組件需要什麼,而且還需要知道其確切的層次結構。我個人對此表示贊同,因爲我將這種協調視爲父組件的工作。或者我創建一個服務將JSON轉換爲包含表示數據/回調(適用於單元測試)的分層視圖模型。你是對的,這有點像你的第二選擇,但沒有真正觸摸視圖的孩子。無論如何,我很好奇你怎麼最終解決這個問題。祝你好運! –