Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Backbone Validate does not work

Tags:

I am using Backbone's validate function to guarantee Man to have an age property more than 18. Here is my code:

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}); 

But looking at the result it seems that validate doesn't work.

like image 765
user1990553 Avatar asked Jan 20 '13 15:01

user1990553


2 Answers

In Backbone.js (prior to version 0.9.10), validate is called before save as well as before set.

You will get an alert error when you set invalid value.

Example - age value is below 18 :

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

EDIT

For Backbone.js version 0.9.10+ there is an issue reported: Failed validation does not trigger error callback. Issue explanation says that

invalid event should be used instead of error

So changing your code to:

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

And setting variable with validate option set to true will trigger an alert.

man.set({age: 12}, {validate : true}); 
like image 66
Tom Avatar answered Oct 11 '22 08:10

Tom


For backbone 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';         }      } }); 

Example 1. Without {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') ); } 

Example 2. With {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') ); } 
like image 35
yesnik Avatar answered Oct 11 '22 08:10

yesnik