开始学习Backbone,尝试在我的Person Model中进行一些简单的验证,但是当我设置一个新的年龄时,似乎没有运行validate方法。任何人都可以解释我可能在哪里出错吗?在我做对了之前,不要继续我的学习。
JS
var Person = Backbone.Model.extend({
defaults: {
name: 'John Doe',
age: 30,
occupation: 'working'
},
validate: function(attrs) {
console.log(attrs);
if ( attrs.age < 0 ) {
return 'Age must be positive, stupid';
}
if ( ! attrs.name ) {
return 'Every person must have a name, you fool.';
}
},
work: function() {
return this.get('name') + ' is working.';
}
});
目前我只是在控制台中设置值,所以:
var person = new Person({
name: 'Lady Madonna',
age: 23
});
person.on('error', function(model, error){
console.log(error);
});
当我将age设置为负值时,validate方法不会生效:
person.set('age', -55);
答案 0 :(得分:10)
模型验证changed in Backbone 0.9.10:
模型验证现在仅在Model#save中默认强制执行,并且在构造或Model#set中不再默认强制执行,除非传递
{validate:true}
选项。
并注意
模型验证现在会触发无效事件,而不是错误。
所以你的代码应该写成
var person = new Person({
name: 'Lady Madonna',
age: 23
});
person.on('invalid', function(model, error){
console.log(error);
});
person.set('age', -55, {validate : true});
答案 1 :(得分:3)
默认情况下,在调用validate()
方法之前会调用save()
。如果您还希望在set()
之前调用它,则应指定{validate:true}选项,例如:
person.set({ age : -55 }, { validate : true });
答案 2 :(得分:0)
这是我前一段时间写的一个例子。 希望它有所帮助:
因此,假设您有一个名为Animal的模型:
var Animal = Backbone.Model.extend({
defaults: {
name: '',
speech: ''
},
validate: function(attribs) {
if(attribs.name === ''){
return "Your animal does not have a name.";
}
},
initialize: function() {
console.log('New Animal creation');
this.on("change:name", function() {
console.log("Change captured");
});
this.on("error", function(model, error) {
console.log(error);
});
}
});
所以当你在javascript的某个地方执行此操作时:
var dog = new Animal();
dog.set('speech', 'kef');
您将收到以下消息/错误:
"Your Animal does not have a name."
现在,在创建新对象'dog'时不会调用验证。 你真的需要使用dog.set()来设置它。
否则不会产生错误。
稍后更改该值也可能不会产生此错误。 (你真的需要使用我猜的设置。)
但是,您始终可以检查模型是否处于有效状态,如下所示:
Model.isValid().
当模型无效时,这将返回false。 所以这个:
var dog = new Animal();
dog.isValid(); //would return a 'false'
dog.set({
'speech': 'kef',
'name': 'fido'
});
dog.isValid(); //would return a 'true'
希望这有帮助!