Лучший способ справиться с более сложной логикой проверки (обязательные поля и т. д.) в базовой модели/представлении?

Хотя встроенный в 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 или что-то еще. Хотелось бы посмотреть, какие шаблоны используют другие.


person J. Ky Marsh    schedule 05.08.2013    source источник


Ответы (1)


В книге Addy Osmani Backbone Fundamentals есть отличный раздел. о проверке свойств модели. Использование плагина Backbone.Validation было бы моим первым предложением, так как оно довольно хорошо обрабатывает обязательные поля, но вы явно упомянули, что хотите этого избежать. Обсуждение этой темы Эдди затрагивает некоторые альтернативы, включая Backbone.validateAll плагин или сосредоточение внимания на проверке форм, а не моделей.

person ajk    schedule 05.08.2013