2017-01-04 25 views
1

我在問這個問題以確保我理解這個概念。在UI路由器中,他們建議儘可能使用嵌套狀態。但是,看起來當你這樣做時,每個狀態/視圖只能有1個控制器。在大多數情況下是好的。但是,如果你需要兩個或更多的控制器在狀態/視圖上,那麼Multiple Named Views似乎是正確的解決方案。因爲它看起來實際上可以有不同的html元素或divs由不同的控制器控制 - 如果有必要的話。UI路由器中的多個命名視圖

因此,例如在搜索結果頁面上,您可以在不同的控制器控制的頁面上擁有不同的元素或div ......這是UI路由器中多個命名視圖的設計目的嗎?

似乎對於更復雜的頁面,比如搜索結果頁面,多個命名視圖比簡單地嵌套狀態更好,因爲您可以擁有身份驗證控制器,自動完成控制器,搜索控制器 - 全部負責頁面上的不同區域。我甚至不知道你是如何用嵌套狀態完成的。

所以我正確理解這一點?

回答

1

我想你對viewsstates的基本定義感到困惑。這就是說,你的理解(對你自己的問題陳述)是正確的。

ui-router中,它將您的應用程序變爲狀態機的基本原理。狀態機的基本定義是,在任何時間點,只有一個state可以保持活動。這實際上非常有用,也是一個很好的設計模式 - 從某種意義上說,當它處於明確定義的狀態時,您可以定義機器(或應用程序)應該執行的操作(或應該如何操作)。也適合調試。

但是,這並不意味着在單一狀態下,機器不能做多件事情。它可以,只要在那個狀態下,它的工作就是做很多事情。以電影預約應用程序爲例。

enter image description here

免責聲明:這是不完全真實的狀態圖還是讓我們只是用它進行討論的目的。圖片由Google搜索提供

現在所有藍色圓角矩形框都是狀態。意思是,當用戶使用該應用時,在任何時間點,他/她都將處於其中一個狀態 - 他必須,否則他不使用該應用。

現在可以很快就意識到,如果用戶在SeatsChoosing狀態,他CAN NOT在其他國家 - 不是PromotionSelection,不Payment,或其他州,同時。他可以去其他國家(稱爲國家轉型),說PromotionSelection,但只有在他選擇完成後。問題是,不超過一個國家在這裏活躍,也不是平行國家。一次只有一個。

雖然它一次只能處於一個活動狀態,但這並不意味着機器無法在單一狀態下執行多個任務。以SeatsChoosing狀態爲例。在SeatsChoosing狀態下,執行多個任務,包括加載電影,獲取位置,顯示時間表等。但是隻有當用戶處於01​​狀態時,用戶纔會體驗所有這些事情。關鍵是你可以在單一狀態下同時執行多個任務,只要你的狀態定義允許。

而這正是ui-router正在實現的。在您的應用的任何時間點,您只能有一個狀態處於活動狀態。嵌套狀態本身仍然是一個單一的狀態,它實際上是一個節點遍歷狀態機 - 當你到達該節點時,只有該節點處於活動狀態。不允許平行狀態。同樣的道理,這並不意味着你的國家一次不能做多件事情。這就是named views的目的。對於一個國家來說,你可以擁有不同的視圖,這些視圖具有不同的明確定義的上下文(視圖),它們都屬於同一個域(狀態),成爲一把大傘。

現在讓我們回到您的搜索結果問題陳述。你如何定義你的狀態,以及如何定義你的觀點?這完全取決於你,但只要確保你使用的是ui-router,你就堅持狀態機的規則 - 也就是沒有並行狀態,但允許並行任務。所以,如果你定義一個狀態是一個頁面,它可以完成許多事情 - 認證,自動完成等等,那麼是的,多個命名視圖是正確的方式,而不是嵌套狀態。但是,如果將searchsearch results分隔爲兩個不同的域,那麼嵌套狀態可能會更好。

對此沒有正確和錯誤的答案,只是設計決定的問題。

希望有所幫助。

+0

有可能有多個命名視圖的嵌套狀態? – user3125823

+0

@ user3125823是的。嵌套狀態仍然是一個狀態;並且一個狀態總是可以有多個命名的視圖。 – CozyAzure

+0

我已經準備好了你的答案几次,真的很好,很簡潔 - 幫助很大。感謝您花時間回答您的問題! – user3125823

相關問題