【问题标题】:backbone relational validate related field骨干关系验证相关领域
【发布时间】: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.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 函数如何(以及为什么)知道 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


【解决方案1】:

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

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,

【讨论】:

  • 嗯,你是对的,但不幸的是,这只是我的示例代码中的错字。问题仍然存在。
【解决方案2】:

可能我找到了解决方案。

模型定义修改:

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');

在这两个修改之后,验证开始工作。

【讨论】: