Один из подходов заключается в размещении обработки ошибок в базовой модели, которую вы расширяете, назначая обработчик ошибок по умолчанию. Этот обработчик ошибок должен обрабатывать как ошибки клиента, так и сервера. Вот как может выглядеть расширение базовой модели:
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, которая содержит проверку на стороне клиента:
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;
}
});
Вы также можете обрабатывать все это в функции проверки, так как она вызывается перед сохранением и после сохранения, когда после сохранения она может иметь дело с ошибками, которые были проанализированы в ответе сервера.
Используя вышеуказанный подход, вам не нужно указывать функцию ошибки при вызове функции сохранения модели. Он должен обрабатываться базовой функциональностью.