Хотя встроенный в Backbone метод validate()
для моделей работает достаточно хорошо для очень простых случаев, он быстро начинает разваливаться при работе с более сложной логикой проверки, такой как обязательные поля. В модели я обычно обрабатываю проверку атрибута следующим образом:
validate: function (attrs) {
var invalid = [],
dateRegex = /^(\d{2})\/(\d{2})\/(\d{4})$/,
timeRegex = /^(\d{2}):(\d{2})$/,
isoDateTimeRegex = /^(\d{4})-(\d{1,2})-(\d{1,2})T(\d{2}):(\d{2}):(\d{2})$/;
if (_.has(attrs, "chosenScheduleDate") && !dateRegex.test(attrs.chosenScheduleDate)) {
invalid.push("chosenScheduleDate");
}
// ...some more validation rules
if (invalid.length > 0) {
return invalid;
}
},
А затем в представлении отфильтруйте недопустимые атрибуты, используя новое событие invalid
:
modelEvents: {
"invalid": "invalidateAttributes"
},
// ...other code
invalidateAttributes: function (model, error) {
if (_.contains(error, "chosenScheduleDate")) {
this.unsetModelAttributes("chosenScheduleDate", "chosenScheduleOpenTime", "scheduleOpenTime");
this.statusNotification.show.call(this, localizedText.displayText.theSelectedDateIsInvalid, "error");
this.ui.chosenScheduleDateInput.addClass("text-input--error");
}
},
Это может привести к довольно длинному методу invalidateAttributes, особенно если я проверяю 6+ атрибутов модели. Кроме того, это не принимает во внимание концепцию обязательных полей, которые я обработал, выполнив неприятные has()
проверки:
if (this.model.has("scheduleOpenTime")) {
$.when(this.parent.saveAppointment.call(this))
.done(function () {
// set a new attribute on the model that represents the successfully-persisted datetime value
that.model.set("savedScheduleOpenTime", that.model.get("scheduleOpenTime"));
that.renderAppointmentForm();
});
}
А затем пришлось бы unset()
атрибутов, когда они недействительны во время попытки набора, фактически позволяя только допустимым атрибутам вообще существовать в модели в любой момент времени.
Есть ли лучший, более элегантный способ обработки более сложной проверки, включая обязательные поля, в моделях Backbone? Я бы действительно предпочел упрощенный подход, который не использует тяжеловесное решение, такое как плагин Backbone.Validation или что-то еще. Хотелось бы посмотреть, какие шаблоны используют другие.