2014-09-04 86 views
0

在我現在的公司,我們正在研究一個非常大的角度應用。不斷爭論的一點是要弄清楚在控制器之間共享非單體狀態的最佳方式。在理想的情況下,在控制器共享恰好是單身人士的狀態的情況下,我們可以將該狀態建模爲service,並在這些之間使用此service,inject進行通信。在控制器之間共享非單體狀態(Angular Architecture)

但是我們希望有這個層次結構的多個實例,這意味着擁有一個singleton將無濟於事。我們需要的是一個基於上下文的單身人士,也可以注射。

目前,我們正在計劃通過在最上面的指令的控制器管理狀態的指令層次做出來,然後將所有下指令require該控制器(指令控制器的指令,指令溝通!),並調用它的功能。這樣做的問題在於,所需的控制器只能通過指令的鏈接功能訪問(這不是很糟糕,但由於大多數情況都會發生在這種狀態下,所以測試變得更加困難。)鏈接功能很難測試比控制器,你可以直接注入控制器並測試它們)。

我確信還有其他人可能面臨類似的情況,並提出一個令人滿意的解決方案!

考慮像這樣的層次結構(例如)爲更好地理解:

<post> 
    <header></header> 
    <button-array></button-array> 
    <editor></editor> 
    <footer></footer> 
</post> 
<post> 
    <header></header> 
    <button-array></button-array> 
    <editor></editor> 
    <footer></footer> 
</post> 

....ñ每個職位米級深..

這裏的例子是小事一樁,只在DOM中進入1級。考慮在應用程序中,我們有4-5級深度指令。我們沿着隔離範圍路線走下去,並將需要的值傳遞給子指令。這很有效,但主要是因爲如果第5層的指令需要某些東西 - 它們之間的所有指令都必須對這些數據進行編組(並暴露一個沒有做任何事情的範圍變量,而是將這個值傳遞到下一個層次)似乎非常脆弱)。

如果你對如何解決這個問題有很好的建築視野 - 請告訴我們。如果你對什麼有效或什麼不會有任何建議 - 那也會很棒。如果您知道用於解決此問題的不同方法的相對優點和缺點 - 那也會很棒。

+0

我不明白「傳遞」問題:如果'post'有一個隔離作用域和'header'等將由'post'創建(通過模板eg),那麼他們不會(閱讀shouldn ')有自己的隔離範圍。所以沒有必要傳遞值。你必須將'header'所需的值傳遞給'post',但這很自然,值的數量應該是有限的。否則,設計是有缺陷的。 – zeroflagL 2014-09-04 11:26:13

+0

@zeroflagL那麼你將如何在'post'' header','button-array'和所有內部子指令之間共享單個狀態對象?我想說的是,我們已經走過了所有具有孤立範圍的路線,而且這樣做的結果並不好,因爲我們對每個指令的屬性列表都是很流行的。 – ganaraj 2014-09-04 11:36:03

+0

但這就是關鍵。這種設計(所有隔離示波器)難以處理的事實可能暗示它可能不是最佳解決方案。如果沒有隔離範圍,這個問題就沒有意義了,或者我錯了? – zeroflagL 2014-09-04 11:46:28

回答

0

如果我正確地考慮這個問題,你的例子中的<post>元素有一些與它們相關的狀態對象,並且他們需要將它們傳遞給<header>等等。

我通過將對象附加到html級別的作用域來解決這個問題。所以<post item="items[0]">,然後帖子模板中有<header item="item">等等。使用isolate scope = type時,更改會在DOM樹中向上和向下傳播,因爲它只是一個將數據保存在其中的JavaScript對象。

您也可以使用指令控制器層次結構,但這意味着像<button-array>這樣的東西在它們出現在模板中的地方是硬連接的(並且如果您按下或拉出子指令的出現位置整個重複對象的DOM層次結構,它打破了事物),而直接將狀態傳遞到每個項目的工作還可以。

我只會這樣做,我會叫'模型狀態' - 你可能最終會發布到某個服務器的東西。發佈標題和內容,標籤等視圖狀態(對象的展開 - 摺疊)在內部由組件處理,並用於檢測組件的界限(如果兩個組件緊密綁定以便需要訪問彼此的視圖狀態,那麼它們實際上是一個組件)。

相關問題