嵌套模式中的布尔值导致所需的状态

时间:2015-03-17 19:01:54

标签: meteor schema meteor-autoform

我已设置schemas,以便通过autoform可以拥有一系列复杂的输入集。类似的东西:

address = {
  street:{
    type: String
  },
  city: {
    type: String
  },
  active_address: {
    type: Boolean,
    optional: true
  },
  ...
}

people: {
  name:{
    type: String
  },

  address:{
    type: [address],
    optional: true,
    defaultValue: []
  }
}

这样添加地址是可选的,但如果添加地址,则需要所有地址字段。

尝试提交表单会为Boolean以外的“地址”下的每个字段引发所需的错误,即使未选中该复选框也是如此。

作为参考,我正在创建表格:

{{#autoForm collection="people" id=formId type="insert" doc=getDocument autosave=true template="autoupdate"}}    
  {{> afQuickField name='name' template="autoupdate" placeholder="schemaLabel"}}
  {{> afQuickField name='address' template="autoupdate"}}
  ...
{{/autoForm}} 

我使用的自定义表单模板非常基于autoform附带的bootstrap3表单模板。

试过

试图像这样添加一个钩子:

 formToDoc:function(doc, ss, formId){
    for (var i = 0, l = doc.address.length; i < l; ++i){
      if (!doc.address[i].active_address){
        delete doc.address[i].active_address;
      };
    }
    return doc;
  }

这解决了提交问题,但仍然为其他值插入一个充满空字符串""的数组。这导致更新表单变得混乱,类似于我的other question中所示的内容。

问题是数组不是空的,而是有一个空值的对象。我可能会在表单中的每个值上运行并删除所有字段,但这感觉非常hacky和昂贵。

1 个答案:

答案 0 :(得分:0)

我上次评估时不正确。我已从人员架构中的地址字段中删除了defaultValue: []。使用formToDoc钩子中的以下代码来解决问题:

for (var i = 0, l = doc.address.length; i < l; ++i){
  if (!doc.address[i].active_address){
    doc.address[i].active_address = null;
  }        
}
return doc;