Respuesta

9

He estado usando el plugin Backbone.validations con gran éxito. Le permite definir sus validaciones tal como lo hace en los modelos de 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

Un enfoque es ubicar el manejo de errores en un modelo base que extienda asignando un controlador de error predeterminado. Este controlador de errores debe manejar tanto la visualización de los errores del lado del cliente como del servidor. Esto es lo que podría parecer la extensión del modelo base:

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); 
    } 

}); 

y luego otros modelos pueden ampliar y obtener esta funcionalidad de validación. Aquí está un modelo de sesión que contiene su validación en el cliente:

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;   
    } 

}); 

También podría manejar todo en la función de validación ya que es llamado antes de una parada de después de la parada donde después de la operación de guardar podría estar tratando con errores que han sido analizados fuera de la respuesta del servidor.

Usando el enfoque anterior, no necesita especificar una función de error cuando llama a la función de guardar del modelo. Debe ser manejado por la funcionalidad base.