骨干关系验证相关领域

时间:2014-02-17 20:37:52

标签: javascript validation backbone.js tastypie relational

我正在使用django tastypie的骨干关系,我对验证关系有问题。

假设我有一个带验证方法的基本模型:

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!";
      }
   }
});

在某些视图中,我正在使用box创建新的MyModel实例作为其他对象的resource_uri:

var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');

,这是meritum ...当我在模型上save时,它总是在attr.box验证失败而attr.boxNone - 即使所有字段都设置了正确。

有趣的是,如果在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函数如何(和为什么)知道,{{{ 1}}是空的吗?

或许我的方法完全错了?

感谢任何线索。

2 个答案:

答案 0 :(得分:0)

您正在错误的对象中设置值:

var BoxUri = '/api/v1/Box/3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri); // NewModel instead of MyModel
NewModel.set('name','new name for model'); // NewModel instead of MyModel

您的问题出在其他地方,here我设置了一个效果良好的示例。

顺便说一下,将relatedModel: 'BoxModel',更改为relatedModel: BoxModel,

答案 1 :(得分:0)

可能我找到了解决方案。

模型定义中的修改:

MyModel = Backbone.RelationalModel.extend({
   idAttribute : 'id', //here i added declaration of id field
   urlRoot : '/api/v1/SampleModel/',
   relations : [
   {
      type: Backbone.HasOne,
      key: 'box',
      relatedModel: 'BoxModel',
      includeInJSON: 'resource_uri' // changed 'id' to 'resource_uri' probably it's not required at all
   }],

   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!";
      }
   }
});

在视图中,我在模型中设置了id而不是resource_uri:

var BoxUri = '3'
var NewModel = new MyModel();
NewModel.set('box',BoxUri);
NewModel.set('name','new name for model');

经过这两次修改后,验证开始起作用。