Backbone.js 主干。模型'defaults'干扰'set'?
我注意到当我有这样的代码时:Backbone.js 主干。模型'defaults'干扰'set'?,backbone.js,Backbone.js,我注意到当我有这样的代码时: window.Todo = Backbone.Model.extend({ defaults: { "title": "" }, validate: function() { if (this.get("title") === "") return "Title is missing!" } }); var todo = new Todo(); co
window.Todo = Backbone.Model.extend({
defaults: {
"title": ""
},
validate: function() {
if (this.get("title") === "")
return "Title is missing!"
}
});
var todo = new Todo();
console.log("Expects blank: ", todo.get("title"));
todo.set({ title: "A valid title" });
console.log("Expects 'A valid title': ", todo.get("title"));
todo.set("title", "");
console.log("Expects blank: ", todo.get("title"));
window.Todo = Backbone.Model.extend({
validate: function() {
if (this.get("title") === "")
return "Title is missing!"
}
});
所有set(…)
似乎都失败:todo.get(“title”)
始终返回空字符串
但是,如果删除默认值
,则会得到预期的输出:
window.Todo = Backbone.Model.extend({
defaults: {
"title": ""
},
validate: function() {
if (this.get("title") === "")
return "Title is missing!"
}
});
var todo = new Todo();
console.log("Expects blank: ", todo.get("title"));
todo.set({ title: "A valid title" });
console.log("Expects 'A valid title': ", todo.get("title"));
todo.set("title", "");
console.log("Expects blank: ", todo.get("title"));
window.Todo = Backbone.Model.extend({
validate: function() {
if (this.get("title") === "")
return "Title is missing!"
}
});
validate不会将模型作为其上下文获取,因此您需要使用函数属性,然后它会按预期工作(validate除外,它会阻止将标题设置为空白) 不,那不是真的,是吗。。validate会将模型作为其上下文获取,但validate会在模型中设置值之前运行,因此当默认值设置为“”时,它总是失败,但在没有默认值的情况下成功,因为未定义!==“”
好的,我想我那次拿到了。问题出在这里。使用验证函数创建模型后。每个集合都使用该函数进行验证。如果在构造期间未指定属性,则会自动应用默认值。因此
var todo=new todo()
将使title=”“
和todo.set({title:“Valid title”})生效代码>将失败,因为验证函数返回错误。您需要做的就是vartodo=newtodo({title:“新标题”})代码>我想我在“andtodo.set({title:“Valid title”})
将失败,因为您的validate函数返回一个错误”。为什么设置title=“有效标题”
会失败?你是说构造器会失败还是什么?你可能会看看我为你做的这个小提琴,所以是的,你当时得到了它,+1。哦,所以我认为你的版本是有意义的,验证将防止模型进入无效状态。但是,您如何解释为什么在没有默认值的情况下,集(“title”和“)
将成功?这是因为,没有默认值,验证将通过,因为未定义的字符串不是空字符串(这是您的验证器正在检查的..即,没有默认值,此.get(“title”)返回未定义。我想这也带来了我的下一个问题。如果我需要知道以前的set()
是否有效,我该怎么做?因为主干验证正在防止模型进入无效状态。我知道有一个错误
事件,如果我需要知道该点的有效性怎么办(不使用回调)?