2011-03-01 101 views
0

我已經做了遵循類似的模式幾種形式爲不HTML表格前完成AJAX請求設計模式:需要提交

  • 兩個相互依存的表單域,讓我們說「街道地址」和「位置」(lon/lat)。

  • 當用戶填寫一個字段時,另一個字段通過ajax調用進行更新。 (例如,如果用戶填寫街道地址,請求地理編碼API並將結果放在位置字段中;如果用戶填寫位置(例如,通過地圖UI),則執行請求到反向地理編碼API和結果放在地址欄。 至今沒問題,這些都是很容易鉤到模糊和/或聚焦變化事件。)

  • 如果表單提交,會出現問題在ajax調用完成之前。在這種情況下,一個字段將具有正確的值,另一個字段將陳舊。服務器上的處理程序需要檢測到發生這種情況並更新陳舊值。我們不能只檢查默認值,因爲用戶可能已經更改了兩個字段的任何次數。

有兩種可能的解決方案我想過,我也不太喜歡任何一種。我很樂意提供其他建議。

溶液1使用隱藏字段的標誌,以指示新鮮度:默認值設置爲0,則AJAX請求被髮送之前重置爲0,並且它在響應返回設置爲1。在服務器端,檢查這些字段並重新計算其新鮮度標誌設置爲0的任何字段。這裏仍存在潛在的競爭條件,但窗口大大縮小。我已經使用了這種技術,它可以工作(例如,http://fixcity.org/racks/new/)。這很煩人,因爲它需要在客戶端和服務器上有更多的代碼,並且是另一個可能的錯誤來源。

解決方案2.改爲使用同步AJAX調用(「SJAX」?)。沒有吸引力,因爲這裏的AJAX只是一個用戶界面的便利,它並不是必須的,因此我寧願不讓事情變得緩慢 - 那麼它就變成了用戶界面*。

解決方案3.總是進行服務器端後處理。如果價格昂貴,請使用緩存使其更便宜 - 例如。如果值爲而不是陳舊,這意味着客戶端只是通過AJAX提出了相同的請求,所以我們應該在AJAX處理程序期間根據需要填充緩存。 這一個目前似乎是最吸引我的,雖然它有兩個限制: 它不能用於不安全和冪等的東西 - 例如。如果AJAX請求正在執行POST;它甚至不能用於這個例子,因爲我們有兩個相互依賴的字段,無法知道哪個是正確的,哪個是陳舊的。

回答

2

當用戶按下提交時,讓它運行一個驗證函數,通過檢查表單字段和ajax調用的狀態(設置一個標記,如ajaxBusy)來決定表單處於什麼狀態。

+0

好的,這聽起來像是解決方案1的客戶端唯一變體。一方面它更好,因爲服務器端的功能更少,另一方面提交將被阻止,直到ajax響應結束。 – slinkp 2011-03-01 22:07:28

2

你可以提高你的AJAX調用都禁用表單提交按鈕,並設置一個全局變量對true是在託運形式提交〜這樣用戶AJAX完成之前不能提交表單。我會爲UI添加一個加載圖形。

1

無論如何,您應該驗證服務器端提交的內容。如果兩個字段都是相關的1-1,那麼您可以將其中的一個指定爲「主」,並單獨提交,而另一個則是服務器端計算的。

+0

不幸的是,在這種情況下不能有一個「主人」:要麼單獨輸入必須被認爲是足夠的。 – slinkp 2011-03-01 22:02:51