您好我是backbonejs的新手,
我在尝试http://addyosmani.github.com/backbone-fundamentals/#validation
的示例时遇到了问题我创建了一个2对象的模型,myTodo和myTodo1,
如果我这样调用set函数,则由于验证错误而返回completed:false
var myTodo = new Todo(); myTodo.set('completed', true, {validate: true}); console.log("completed: "+myTodo.get('completed')); /* The above code returns following log: This model has been initialized. Remember to set a title for your todo. completed: false */
购买执行以下代码时未执行验证的原因
var myTodo1 = new Todo(); myTodo1.set('completed',true); console.log("completed: "+myTodo1.get('completed')); myTodo1.set({validate:true}) console.log("completed: "+myTodo1.get('completed')); /* The above code returns following log: This model has been initialized. underscore-test2.js:11 completed: true underscore-test2.js:28 completed: true */
虽然两组代码执行相同的工作,但在第一种情况下验证执行但不在第二种情况下执行
为什么?????
下面的是完整的示例代码。
var Todo = Backbone.Model.extend({ defaults: { completed: false, }, validate: function(attribs){ if(attribs.title === undefined){ return "Remember to set a title for your todo."; } }, initialize: function(){ console.log('This model has been initialized.'); this.on("invalid", function(model, error){ console.log(error); }); this.on('change:title', function(){ console.log('- Values for title have changed.'); }); } }); **var myTodo = new Todo(); myTodo.set('completed', true, {validate: true}); console.log("completed: "+myTodo.get('completed'));** **var myTodo1 = new Todo(); myTodo1.set('completed',true); console.log("completed: "+myTodo1.get('completed')); myTodo1.set({validate:true}) console.log("completed: "+myTodo1.get('completed'));**
答案 0 :(得分:1)
他们完全不同。
myTodo1.set({validate:true})
这里您没有运行验证。您只需将模型的属性“validate”设置为true即可。基本上,在第二个示例中,您将设置2个属性而不进行验证。
在任何情况下,您都不能希望之后进行验证,因为您的属性已经设置好了。
修改强>
但是,我不知道在为validate属性设置新值时的行为。但是你肯定用布尔值覆盖你的验证函数。这肯定会导致意想不到的行为。
编辑2:
好的,我猜这将是我的最后一次尝试。
myTodo1.set({completed:true});
myTodo1.set({validate:true});
也相当于:
myTodo1.set({completed: true}).set({validate: true});
但不等同于任何情况下:
myTodo1.set({completed: true}, {validate: true});
在lattest中,{validate: true}
告诉Backbone在模型上应用验证功能。
在前者中,您只将已完成属性设置为true ,而不告知模型验证。 然后您再次将验证属性设置为true ,而不告诉模型验证。所以基本上你永远不会告诉模型验证。