【发布时间】:2014-03-17 07:46:25
【问题描述】:
我正在使用与 django sweetpie 的骨干关系,但验证关系有问题。
假设我有一个带有 validate 方法的基本模型:
MyModel = Backbone.RelationalModel.extend({
urlRoot : '/api/v1/SampleModel/',
relations : [
{
type: Backbone.HasOne,
key: 'box',
relatedModel: 'BoxModel',
includeInJSON: 'id'
}],
validate : function(attr)
{
if(!attr.name)
{
console.log('attr name validation fail');
return "C mon! name is srsly required!";
}
if(!attr.box)
{
console.log('attr box validation fail');
console.log(attr.box);
return "Damn! you forgot to set box!";
}
}
});
在某些视图中,我正在创建新的 MyModel 实例,其中 box 作为其他对象的 resource_uri:
var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');
这是优点...当我在模型上创建 save 时,它总是在 attr.box 验证上失败,而 attr.box 是 None- 即使所有字段都设置正确。
有趣的是,如果在 validate 函数中,执行以下操作:
validate : function(attr){
if(!attr.name)
{
console.log('attr name validation fail');
return "C mon! name is srsly required!";
}
console.log(attr.box);
}
在上述情况下,attr.box 作为所需对象显示在控制台中。
当然,如果我删除验证方法,对象将被正确保存,具有适当的关系等。
正如我在文档中所写的那样,默认情况下,验证仅在调用 save() 时运行,因此所有字段都已设置。那么validation 函数如何(以及为什么)知道 attr.box 为空?
或者也许我的方法完全是错误的?
感谢您提供任何线索。
【问题讨论】:
-
当您检查
if(!attr.box)console.log(attr.box);打印到控制台的内容时 -
如果我这样做
if(!attr.box),console.log 返回null。但是如果我 console.log(attr.box) 没有检查条件,我会进入控制台整个对象。 -
在
if(!attr.box)之前和之后尝试console.log(attr.box);看看会发生什么。 -
我得到 3x null:条件前 1 个 null,条件内 1 个 null,条件后 1 个 null,我认为,即使它包含值,所有 console.log 都会显示相同的值 - 在控制台中你将始终看到最新版本的对象。
-
所以和
if(!attr.box)无关?也许您的问题出在其他地方。
标签: javascript validation backbone.js tastypie relational