回答

9

我一直在使用Backbone.validations插件取得了巨大的成功。它允許你像在Rails模型中那樣定義你的驗證。

var ValidatingModel = Backbone.Model.extend({ 
    validate : { 
    name : { 
     required : true, 
     pattern : /[a-zA-Z]+/, 
     minlength : 3, 
     maxlength : 100 
    }, 
    age : { 
     type: "number", 
     min: 0, 
     max: 200 
    }, 
    email : { 
     type: "email" 
    }, 
    homepage : { 
     type: "url" 
    }, 
    occupation : { 
     in : [ 
     "Lawyer", 
     "Doctor", 
     "Professor", 
     "Economist" 
     ] 
    } 
    } 
}); 
12

一種方法是將您的錯誤處理定位到您通過分配默認錯誤處理程序來擴展的基本模型中。此錯誤處理程序應該處理客戶端和服務器錯誤顯示。以下是基本模型擴展的樣子:

Model = Backbone.Model.extend({ 

    ui: Utils.UI, 

    initialize: function(attributes, options) { 
    options || (options = {}); 
    _.bindAll(this, 'defaultErrorHandler'); 
    this.bind("error", this.defaultErrorHandler); 
    this.init && this.init(attributes, options); 
    }, 

    // Gets call for failures in validate and for server failures. 
    defaultErrorHandler: function(model, error) { 
    var errors; 
    if (_.isArray(error)) { 
     errors = error.join('<br/>'); 
    } else { 
     // Server error; parse as needed into a displayable error. 
    } 
    this.ui.showError(errors); 
    } 

}); 

然後其他模型可以擴展並獲得此驗證功能。下面是其中包含了客戶端驗證會話模式:

Session = Model.extend({ 

    validate: function(attrs) {  
    var errors = [] 
    if (_.isEmpty(attrs.email)) { 
     errors.push("Email can't be blank"); 
    } 
    if (_.isEmpty(attrs.password)) { 
     errors.push("Password can't be blank"); 
    } 
    return _.any(errors) ? errors : null;   
    } 

}); 

你也可以處理所有的驗證功能,因爲它保存之前被調用後保存在那裏後,保存它可能被處理錯誤已經解析出服務器響應。

使用上述方法,您在調用模型的保存功能時無需指定錯誤函數。它應該由基本功能來處理。