更新时需要AutoForm 5.0.2嵌套架构输入

时间:2015-03-12 18:16:17

标签: validation meteor nested schema meteor-autoform

我已经设置了模式,以便我可以拥有一组复杂的输入集。类似的东西:

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

people: {
  name:{
    type: String
  },

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

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

这在(我相信它是)版本4.2.2中有效。这仍然适用于insert类型的autoforms,但不适用于update类型的autoforms。执行更新时,除非嵌套模式中的所有必填字段也有效,否则不会提交任何字段。

作为参考,我是这样创建表单的:

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

我的模板(autoupdate)我复制粘贴了整个bootstrap3 autoform模板并重新排列了一些html以满足我的需求。我在更新时根据5.0.0更改日志尽我所能更新了这些内容。如果有人能够想到模板中的属性会导致在5.0.0中更改的插入和更新之间出现不一致的行为,那么它可能就在那里。

更多信息

我刚尝试使用5.0.2中的bootstrap3模板重新创建所有表单模板。还是一样的行为。

+

我在地址架构中有一个布尔(复选框)输入。查看文档,地址数组中填充了[0 : {active_address: false}]

active_address: {
  type: Boolean,
  optional: true
}

不确定这是否有帮助...

+

根据@mark的建议,我添加了defaultValue:[]。它解决了这个问题......没有"开放"现在更新表单中的嵌套模式,并且可以更改其他值。如果你"添加"使用“添加”按钮对表单进行嵌套架构,即使您未在任何字段中插入任​​何值,也需要整个表单。无论Boolean类型输入如何,都会发生这种情况。

我可以确定嵌套模式中的Boolean类型输入会导致整个嵌套模式成为插入的必要条件。删除布尔输入使其再次可插入。因此,同样存在一个新问题。

可以找到这个新问题here

1 个答案:

答案 0 :(得分:1)

我认为最好的解决方案是在架构中的defaultValue: []字段中添加address。您在问题中描述的行为(不允许更新)实际上是打算 - 阅读以了解原因。

问题是,只有在表单中添加了数组表单元素时,才会出现此行为。我的意思是,如果您单击从表单中删除街道,城市等输入的减号,则更新会成功,因为当用户明确取消选中该框时,AutoForm不会误解未选中的复选框(因此设置false)的值。将defaultValue设置为空数组让AutoForm知道不显示地址表单,除非用户明确点击了加号(即,他们有一个他们想要输入的地址),在这种情况下,制作街道,城市等所需的字段是你想要的。

请注意,这意味着您必须更新集合中缺少address字段的现有文档,并将其设置为空数组。在mongo shell中有类似的东西:

db.people.update({ "address": { $exists: false } }, { $set: { "address": [] } }, { multi: true })

您可能希望首先在选择器上运行查找来确保查询正确。

修改

如果您想要的行为是显示子表单而不使其成为必需,您可以使用formToDoc挂钩并过滤掉所有地址对象来解决复选框问题只有active_address字段设置为false(AutoForm错误地为我们添加的字段)。

AutoForm.addHooks('yourFormId', {
  formToDoc: function (doc) {
    doc.address = _.reject(doc.address, function (a) {
      return !a.street && !a.city && !a.active_address;
    });
    return doc;
  }
});

每次验证表单时都会调用formToDoc挂钩,因此您可以使用它来修改doc以使AutoForm永远不会知道存在地址子字段,除非属性已经设定好了。请注意,如果您使用此解决方案,则无法按上述方式添加defaultValue: []