2011-12-19 29 views
2

我正在構建一個Web應用程序,通過URL在內部管理狀態,允許用戶通過瀏覽器按鈕以及網站的UI來操作狀態。如何管理應用程序和URL中的狀態?

我使用jQuery-BBQ來管理URL散列,並且我有一個hashchange的處理程序,當URL更改時(例如,瀏覽器回退/前進按鈕按下)相應地更改相應內容。然而,事情相應地改變了我自己最終改變散列,從而觸發hashchange處理程序,並導致循環。

爲了解決這些情況,我發現自己正在檢查新狀態是否與前一個狀態相同,如果是,則保存。但我很快得到了漂亮的代碼,分別針對每個狀態分別處理每個狀態的多個參與者。

有沒有優雅地處理這種狀態管理場景的設計模式?

+0

也許我不清楚在我的問題,我不尋找替代使用URL哈希;更一般地說,我試圖找到一種方法來管理狀態,當更改可能來自多個輸入(UI,瀏覽器狀態/ URL)並可能影響程序的多個部分。 – ericsoco

回答

0

我最終所做的就是嚴格地在我的程序中只提供一個可以改變狀態的地方,並且通過這一個地方路由所有狀態改變。

由「一個地方」,我的意思是一組可公開訪問的功能,其工作包括:

  1. 驗證請求的狀態變化
  2. 驗證新請求的狀態變化,比目前的狀態
  3. 更新不同應用狀態
  4. 更新瀏覽器狀態

步驟2是也許是最IMPO rtant - 它確保狀態更改請求是來自應用程序內還是來自瀏覽器,不會有任何重複的嘗試來改變應用程序或瀏覽器的狀態,而不會改變初始狀態。

到目前爲止這麼好,這似乎在我的代碼的一部分中封裝了狀態機的複雜性,使得事情變得更容易...仍然,我歡迎任何其他答案。我很積極,這是一個多次解決的問題。

1

我不能推薦你現在實現的任何特定的設計模式,但我可以建議你看看html5的pushSate()和popState()函數。這些功能能夠存儲狀態以及與這些狀態相關的數據。 github.com使用這種技術遍歷某個公共存儲庫的目錄。這裏有一個快速指南:https://developer.mozilla.org/en/DOM/Manipulating_the_browser_history。希望這可以幫助。

+0

是的,jQuery-BBQ內部使用push/popState,其API使用這些函數名稱。 – ericsoco

相關問題