2011-07-13 198 views
11

如何在遇到服務器端錯誤(例如驗證錯誤)時回滾模型更改?Backbone.js服務器端驗證和其他服務器端錯誤

鑑於某些驗證必須在服務器端完成,使用backbone.js(Rails後端)執行此操作的適當方式是什麼?

當保存骨幹模型時,如果驗證失敗(該模型的視圖不更新),則會觸發客戶端驗證,以提供適當的用戶體驗。但是,如果服務器端驗證失敗,那麼在PUT到服務器之前,模型及其所有視圖都已更新(使用無效數據)。

這似乎有一些問題。

  1. 所有視圖都在模型被服務器端驗證之前更新。 如果,例如,你的機型列表,並附有彈出的編輯對話框 ,在列表中的模型與潛在 非可驗證的方式調用Model.save但它已被 服務器端驗證後,才更新PUT'ed。
  2. 如果服務器返回錯誤(例如422錯誤),則不會發生模型的「回滾」。無法驗證的數據就像坐在這裏一樣。這真的很糟糕。

我使用backbone.js錯了嗎?有沒有一種衆所周知的方式來處理這種(很常見)的情況?我知道我可以對舊值進行一些手動緩存等,但這是一種很臭的解決方案。

謝謝!

+0

這似乎在這裏回答:http://stackoverflow.com/a/10335668/1284283(一年後,可能是一個較新版本的backbonejs)。 – brightgarden

回答

5

不知道如果我這樣做不對(新BackboneJS),但我有同樣的問題,這裏是我如何解決它:

  • 我盡我的驗證服務器端

  • 而不是做一個正常的model.save,我做了一個標準的ajax調用服務器,並返回一個錯誤消息或包含修改模型的屬性的成功消息。如果它是成功的,那麼我可以使用返回的屬性來執行model.set以更新模型和相應的視圖。

  • 如果您想先做客戶端驗證,我想您可以使用{silent:true}選項進行保存,以便視圖不會更新,然後執行ajax調用,並查看需要什麼根據響應來完成(如果錯誤成功恢復原始值或成功更新視圖)

希望這會有所幫助。

ps:這個工程,但不覺得「乾淨」。如果有更好的解決方案,我也很樂意閱讀它

+0

我不知道{silent:true}參數。這可能有助於在中間狀態下保持視圖更新。我同意,其他人不覺得'乾淨':P 對不起,我不能做'投票';我還沒有足夠的聲望。 – John

0

我會做的是在服務器端確保您捕獲任何錯誤,並在從數據庫返回原始記錄的響應查詢並返回爲JSON以及錯誤響應。然後您可以這樣做:

model.save({}, { 
    error: function(model, response){ 
    model.set(response); 
    } 
}); 

假設您的視圖正在監視模型上的更改事件,它們會相應地更新。

+0

這對錯誤的某個子類很有用(我開始沿着這個路徑走),但是對於某些返回對象表示的錯誤可能是不可行或不合適的(例如,傳輸級錯誤或'訪問被拒絕'或'未記錄在某種程度上)。 儘管可能會出現一些錯誤,但最終可能會這樣做;它肯定有助於正常的服務器端驗證。 – John