2012-02-14 76 views
12

當ajax json響應回來時,您使用了Knockout js的哪些最佳實踐。淘汰js最佳實踐ajax錯誤處理

如何創建映射以便向用戶顯示錯誤? 如何更改Knockout js中表單的綁定以適應錯誤?

我發回的一個響應對象{響應:「成功」,數據:{}},這種裝置有3個級別的錯誤的:

  1. 模型誤差(的JSON對象響應「失敗」,有哪些領域的模型數據是錯誤的)
  2. 服務器錯誤(服務器沒有響應)
  3. 服務器,錯誤代碼爲

還沒有想出顯示的乾淨的視圖模型的方式迴應呃或消息,這就是爲什麼我問。

回答

7

就我個人而言,我只會在成功時更新淘汰賽模式。然後這會使模型處於與錯誤之前相同的狀態。

在出現錯誤的情況下,您可以執行任何操作,告訴用戶出現了錯誤。我會使用humane.js向用戶顯示一條消息,指出由於某種原因更新或創建失敗。在您的三種模型錯誤,無響應或服務器錯誤的情況下,您可以檢查錯誤功能中的帖子狀態,並選擇不同的消息以向用戶顯示。

然後他們可以自由地做同樣的事情再次,或糾正他們的錯誤,然後再試一次。

$.post("somewhere") 
.success(function() { 
    // update knockout models here 
}) 
.error(function() { 
    // show error message to user 
}) 
.complete(function() { 
    // reset any temporary variables 
}); 
9

的方式,我拿出在KO錯誤處理一直是創建一個基類:

errorHandlingViewModel = function() { 
    var self = this; 
    self.ErrorText = ko.observable(); 
    self.errorHandler = function (jqXHR, textStatus, errorThrown) { 
     self.ErrorText('An error has occured, please refresh the page and try again in a little while. (' + textStatus + ':' + errorThrown + ')'); 
    }; 
    self.validationErrorHandler = function (err) { 
     //todo 
     alert('validation error ' + err); 
    } 
    self.successHandler = function (data, onSuccess) { 
     if (data.result == "success") { 
      if (onSuccess) { 
       onSuccess(data.data); 
      } 
     } 
     else { 
      if (data.data && data.data.Tag) { 
       if (data.data.Tag == "ValidationError") { 
        validationErrorHandler(data.data.Tag); 
       } 
      } 
      errorHandler(null, data.result, data.data); 
     } 
    }; 
}; 

這有可觀察到的ERRORTEXT場。

所有我的ViewModels需要這種錯誤處理可以使用原型繼承:

viewModel.prototype = new errorHandlingViewModel(); 
var mainViewModel = new viewModel(); 
ko.applyBindings(mainViewModel, $("#locationTOApplyBindingTo")[0]); 

在這個視圖模型Ajax調用是這樣的:

$.ajax({ 
    type: 'POST', 
    url: myURL, 
    data: myData, 
    success: function (data) {self.successHandler(data,success);}, 
    error: self.errorHandler 
}); //end ajax 

用戶界面是一個簡單的數據綁定:

<div class="error" data-bind="visible:ErrorText"> 
    <div class="innerMSGContainer"> 
     <div class="innerMSG" data-bind="text:ErrorText"></div> 
    </div> 
</div> 

Javascript Try-Catch仍然缺少此模型,因爲我不確定pl acement