Магистральная проверка не работает
Я использую функцию 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
не работает.
Ответы
Ответ 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