Backbone Model里面的validation方法没被调用?

开始学习Backbone,尝试在我的Person Model中进行一些简单的validation,但是当我设置一个新的年龄时,似乎没有运行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); 

Backbone 0.9.10中的模型validation已更改 :

模型validation现在仅在Model#save中默认强制执行,并且在构造或Model#set中不再默认强制执行,除非传递{validate:true}选项。

并注意到

模型validation现在触发无效事件而不是错误

所以你的代码应该写成

 var person = new Person({ name: 'Lady Madonna', age: 23 }); person.on('invalid', function(model, error){ console.log(error); }); person.set('age', -55, {validate : true}); 

还有一个小提琴http://jsfiddle.net/nikoshr/aUxdS/

默认情况下,在调用save()方法之前调用validate() 。 如果您还希望在set()之前调用它,则应指定{validate:true}选项,例如:

 person.set({ age : -55 }, { validate : true }); 

这是我前一段时间写的一个例子。 希望能帮助到你:

所以假设你有一个名为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’时不会调用validation。 你真的需要使用dog.set()来设置它。

否则它不会产生错误。

通过稍后更改该值,它可能也不会给出此错误。 (你真的需要使用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' 

希望这可以帮助!