2014-01-30 43 views
7

那麼,隨着技術的進步,我們的問題解決了不久前再次出現。跨單頁視圖維護應用程序狀態翻轉和多頁翻轉

回到黑暗時代,當PHP和ASP被認爲是很棒的時候,我們總是遇到視圖狀態的問題。如果你有一個頁面,說上十幾個選擇組合框,您的用戶選擇一些組合和明年命中,然後意識到他們搞砸了,打在瀏覽器上的後退按鈕,組合框會回來在默認狀態下,通常選擇選項[0]。爲了防止這種情況,我們不得不寫的樣板代碼容載量,將這些組合框的狀態保存到一個cookie,或會話變量,或東西,這樣當用戶點擊後退按鈕,我們可以重新加載組合框背面到他們離開時的狀態。

如果屏幕上有數據網格,則會進一步加劇此問題。因爲那樣你就必須想出一些方法來將網格保存在某個地方,以防止再次訪問數據庫。

隨後趕來的光。瀏覽器開發人員意識到,由於這個問題,大多數Web開發人員已經接近編寫Cobol終端程序,並向瀏覽器添加了UI緩存。這讓我們的webdevs不必擔心這個問題,除非在奇怪的情況下。

所以,生活得很好。然後有人提出了一個聰明的想法,試圖在沒有所有麻煩的情況下複製GWT,並且Web使用所有這些JavaScript框架進行爆炸。目前專門處理的是AngularJS 1.2.10和Angular-UI。直到星期五(很可能是星期三),我才能對這項技術是否是我們現有標準(這是非常普遍討厭的)JSF的可行替代方案進行初步評估。因此,我遵循一些指南,幾次將我的頭撞在桌子上,我有一個角度爲3的實際HTML頁面,每個HTML頁面有2個視圖。

在你去那裏之前,瞭解我們不能使用它,除非我們可以做多頁JS應用程序。其中一些應用程序已經開發了十年甚至更長時間,並且在整個用戶界面的廢棄以及重新開始時都沒有經濟可行性。相反,我們會做這樣的事情,比如採用這50個struts頁面並將它們轉換爲angular/rest並將它們無縫鏈接迴應用程序的剩餘800個struts頁面。

所以在我的這個練習中,我遇到了我的舊剋星。後退按鈕查看狀態問題。

我一直在玩UI路由系統。我可以使用路線系統進行深度鏈接,這一事實解決了我的部分問題。但是,如果說我有一個搜索頁面這樣的:

及各種組合框中選擇和文本輸入的組合來了1000人的名單。現在用戶在數據網格上選擇其中一個人,並且您需要查看詳細信息。那麼事實上,你可以使用路由做一些像index.html#detail/bob是很酷,但如果用戶意識到這就是錯誤的鮑勃和點擊後退按鈕,他們又得到了一個空白搜索屏幕,他們要過來,更糟糕的進入都還沒有,發再次搜索數據庫以重建數據網格。在搜索數據時,其中一些屏幕有50個或更多選項可供選擇,因此試圖將所有這些選項放入URL路由中對我來說聽起來完全不切實際。

現在在我的研究,我發現這個職位:

Preserve state with Angular UI-Router

這是有前途,主要是因爲我有,我可以存儲到Redis的數據庫或案件會話EJB視圖狀態對象的時候,用戶實際上跳出角度並進入傳統的Struts應用程序,然後返回到角度應用程序的按鈕,但事實仍然存在於這些頁面中的某些頁面上,這是大量的樣板代碼,我們必須按順序編寫代碼使其工作。

我真的不介意在用戶輸入或離開系統中的HTML頁面時,必須手動保存視圖狀態對象並從Redis服務器讀取內容或將其讀回。我真正想要的是一種自動生成要保存的對象而無需編寫大量鍋爐代碼的方法。

這可能嗎?我一直在閱讀ui-route文檔,但它看起來並不像這樣,至少不是我已經翻譯過。

如果這是可能的,我應該看什麼控件?

感謝

--------------編輯

我只是想的東西。每個單頁面應用程序都有一箇中心範圍。 (IM基本上將要建立多單頁的應用程序和掛鉤在一起),所以,如果我使用的命名慣例,這樣的事情

$scope.viewstate.view-search.searchType 
$scope.viewstate.view-search.resultType 
$scope.viewstate.view-search.searchState 

然後視圖狀態的對象應該僅僅是一個JS數組,當我創建函數移動到struts.do,我可以簡單地將該數組作爲嵌套地圖對象保存到Redis服務器。然後,當我的用戶返回到角度應用程序的按鈕時,我可以使用路徑系統捕獲該對象,並從Redis中檢索該視圖狀態對象,並將其重新插入到我的範圍中,從而一次性重新構建整個單一頁面應用程序的範圍。

會這樣嗎?

回答

2

我相信你有一個非常複雜的問題,試圖在不同頁面之間保持視圖狀態與頁面中的數據量。我認爲這樣做的唯一真正有效的方法是編寫一個角度服務,然後可以傳遞到您的各種頁面。因爲您已經知道該服務是一個單例,您可以在各種控制器中使用該單例,並可以按照您所描述的方式使用它來維護視圖狀態。這裏看看這個鏈接,看看它是否會有所幫助:http://txt.fliglio.com/2013/05/angularjs-state-management-with-ui-router/

經過一些想法,你在編輯中建議可能會起作用,但我仍然會使用服務來檢索該數據的數組,因爲它會使它更容易重新插入到角度範圍內

2

我正在探索類似於我正在編寫的Angular應用程序的某些內容。在頁面刷新期間保持用戶登錄很容易。刷新後在頁面上顯示狀態是一個完全不同的問題。

國家要堅持多久?我正在評估兩種可能性。

首先,將狀態(當前表單值或其他)保存到數據庫。隨着頁面的變化,逐漸將狀態保存到數據庫。在瀏覽器刷新上檢查數據庫中保存的值。

二是使用本地瀏覽器存儲。這是5兆的存儲空間。 5 megs是很多文字。同樣,這些數據將逐漸保存到存儲中。刷新瀏覽器時,只需從localStorage加載數據即可。