我正在使用Backbone和Marionette,我正在从后端检索我的模型
这些模型属于一个集合。
问题是:
1)除非在初始化中明确指出,否则永远不会调用validate方法。为什么呢?
2)当我显式调用validate方法时,它会正确返回我为测试创建的无效模型。但我无法捕捉到“无效”事件。我做错了什么?
这是模型:
var Job = Backbone.Model.extend({
validate: function(attrs){
if (! attrs.title ) {
return "A job should have a title";
}
},
initialize: function(){
this.validate(this.attributes); //manual call to validate
this.on("invalid", function(model, error){ //never executed even when the validate model returns the error string
console.log(error);
});
}
});
这里收藏:
var JobList = Backbone.Collection.extend({
model: Job,
url: '/api/1.0/jobs/',
parse: function(response) {
return response.results;
}
});
答案 0 :(得分:5)
验证逻辑在Backbone 0.9.10
中已更改。从change log引用,验证现在的工作原理如下:
模型验证现在仅在Model#save中默认强制执行,并且在构造或Model#set中不再默认强制执行,除非传递{validate:true}选项。
因此,如果您希望在初始化或set
时验证模型,则需要将选项validate:true
传递给构造函数/方法。
当您手动调用invalid
方法时,您未收到model.validate
事件的原因是Backbone 未执行任何验证。你调用你在模型上定义的方法,Backbone对此一无所知。
Backbone中的模型验证是基于Backbone没有在模型上定义名为validate
的方法的意义上的约定 - 您自己做。但是,如果您已经定义了这样的方法,Backbone将在验证发生时(save
或带validate:true
的构造函数/ setter)为您调用它,并且invalid
事件将被触发