Подтвердить что ты не робот

Магистральная проверка не работает

Я использую функцию Backbone validate, чтобы гарантировать, что Man имеет свойство age больше 18. Вот мой код:

var Man = Backbone.Model.extend({
    initialize : function(){
        this.on("error",function(model,error){
            alert(error);
        });
    },
    validate : function(attrs,options){
        if (attrs.age < 18){
            return 'below 18';
        } 
    }
})

var man = new Man({name : 'qian', age : 12});

Но, глядя на результат, кажется, что validate не работает.

4b9b3361

Ответ 1

В Backbone.js(до версии 0.9.10), validate вызывается до save, а также до set.

При установке недопустимого значения вы получите предупреждение.

Пример - age значение ниже 18:

var man = new Man ({name : 'qian', age : 12});
man.set({ age: 12 }); // that will trigger alert

ИЗМЕНИТЬ

Для версии Backbone.js 0.9.10+ сообщается о проблеме: Ошибка проверки не вызывает обратный вызов ошибки. В объяснении проблемы говорится, что

invalid следует использовать событие error

Итак, измените свой код на:

var Man = Backbone.Model.extend({
    initialize : function(){
        this.on("invalid",function(model,error){
            alert(error);
        });
    },
    ...

И установка переменной с опцией validate, установленной на true, вызовет alert.

man.set({age: 12}, {validate : true});

Ответ 2

Для магистрали v.1.0.0

var Man = Backbone.Model.extend({
    initialize : function(){
        this.on("invalid",function(model,error){
            alert(error);
        });
    },
    validate : function(attrs, options){
        if (attrs.age < 18){
            return 'below 18';
        } 
    }
});

Пример 1. Без {validate: true}

//Object will be created with invalid attribute 'age' 
var man = new Man({name : 'qian', age : 12});
console.log(man) // Returns an object with invalid attributes

// But we'll use only valid objects.
// Also we'll get the error message in alert, if validation fails.
if(man.isValid()){
    alert( man.get('name') );
}

var man = new Man({name : 'qian', age : 19});
if(man.isValid()){
    alert( man.get('name') );
}

Пример 2. С помощью {validate: true}

//Object will be created without any passed attributes
var man = new Man({name : 'qian', age : 12}, {validate:true});
console.log(man) //Object will be without passed attributes

/* man.isValid() returns 'true' throw we passed invalid attrs.
   We won't see any error alert message, because Backbone created empty object */
/* Doesn't work */
if(man.isValid()){
    alert( man.get('name') ); //undefined
}
/* Works */
// Created model had invalid attrs, so validationError won't be empty.
// If all attrs are valid, validationError will be empty
if(!man.validationError){
    alert( man.get('name') );
}

Ответ 3

Если вы используете новую версию ( > 1.0) Backbone и хотите активировать проверку во время метода model.set,

вам необходимо пройти {validate: true}, чтобы выполнить проверку.

использование

model.set({field:value},{validate: true})

ИЛИ

model.set("field","value",{validate: true})

вместо

model.set({field:value})

REF: Журнал изменений магистрали

Ответ 4

var man = new Man({name : 'qian', age : 12}, {validate : true});

EDIT:

метод проверки работает только в том случае, если вы передаете объект опций с параметром validate (из версии 0.9.9): https://github.com/documentcloud/backbone/blob/master/backbone.js#L539

И он вызывает событие error, но invalid event