以下代码有什么问题?
(function(){
window.App = {
Models: {},
Collections: {},
Views: {}
};
window.template = function(id) {
return _.template($('#' + id).html());
};
App.Models.Task = Backbone.Model.extend({
defaults:{
title: '',
priority: 0
},
validate: function(attrs, options){
if (attrs.priority < 0){
return 'Priority cannot be negative.';
}
}
});
var task = new App.Models.Task ({ title: 'Sample Task', priority: 5 });
task.on('invalid', function(model, error) { console.log(error); })
task.save({ priority: -9 }); // Should not pass validation
console.log(task.validationError); // Prints a validation error
console.log(task.toJSON()); // Model is updated with -9
console.log(task.isValid()); // false
})();
输出:
Priority cannot be negative. app.js:27
Priority cannot be negative. app.js:30
Object {title: "Sample Task", priority: -9} app.js:32
Priority cannot be negative. app.js:27
false
我目前正在观看视频教程,它基于旧版本的backbone.js,其中默认情况下在set
方法上强制执行验证。但在当前版本中,默认情况下,验证是在save
方法上强制执行的。
但即使它不是有效值且验证没有通过,为什么它仍然将值设置为-9。当验证没有通过时,不应该设置值吗?
答案 0 :(得分:6)
在当前版本的Backbone.js中:
默认情况下,在保存之前调用validate,但如果传递了{validate:true},也可以在设置之前调用。
因此,为了在您的方法上调用此方法,您应该在模型上设置属性时将validate设置为true,如下所示:
yourmodel.set('someproperty', 14, {validate: true});
我希望我的回答很有帮助。
答案 1 :(得分:3)
使用新版本,在保存新数据时,您需要传递验证选项:
task.save({ priority: -9 }, {validation: true});
答案 2 :(得分:1)
这是官方网站代码的问题。查看save
函数的来源,我了解options.validate
到true
的预设在set
被调用之后发生。
您可以尝试切换行的顺序(在save
的{{1}}函数中):
Model
为:
if (attrs && (!options || !options.wait) && !this.set(attrs, options)) return false;
options = _.extend({validate: true}, options);
但我不确定它是否会破坏别的东西。
或者你可以使用GitHub repo中的代码 - 有一个改变可以解决这个问题。
答案 3 :(得分:0)
好的,您只需要将标志'wait'设置为true或将'validate'标志设置为true。如何?好吧,如果你没有将wait标志设置为true,那么将使用在验证之前传递save方法的选项调用set方法。因此,您不需要传递validate标志,set方法不会接收它,不运行验证,并设置属性。
由于文档不清楚等待标志:您的服务器仍将收到更新的数据。