Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 主干。模型'defaults'干扰'set'?_Backbone.js - Fatal编程技术网

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:“新标题”})我想我在“and
todo.set({title:“Valid title”})
将失败,因为您的validate函数返回一个错误”。为什么设置
title=“有效标题”
会失败?你是说构造器会失败还是什么?你可能会看看我为你做的这个小提琴,所以是的,你当时得到了它,+1。哦,所以我认为你的版本是有意义的,验证将防止模型进入无效状态。但是,您如何解释为什么在没有
默认值的情况下,
集(“title”和“)
将成功?这是因为,没有默认值,验证将通过,因为未定义的字符串不是空字符串(这是您的验证器正在检查的..即,没有默认值,此.get(“title”)返回未定义。我想这也带来了我的下一个问题。如果我需要知道以前的
set()
是否有效,我该怎么做?因为主干验证正在防止模型进入无效状态。我知道有一个
错误
事件,如果我需要知道该点的有效性怎么办(不使用回调)?