代码之家  ›  专栏  ›  技术社区  ›  Randy Hall

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

  •  1
  • Randy Hall  · 技术社区  · 9 年前

    我设置了模式,以便可以拥有一个复杂的输入集数组。类似于:

    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 键入自动表单,但不打开 update 键入自动表单。进行更新时,除非 全部的 嵌套模式中的必填字段也是有效的。

    作为参考,我将创建如下表单:

    {{#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自动表单模板,并重新排列了一些html以满足我的需要。当我更新时,我根据5.0.0变更日志尽我所能更新了这些。如果有人能想到模板中的某个属性会导致插入和更新之间的行为不一致(在5.0.0中发生了变化),那么它可能就在其中。

    更多信息

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

    +

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

    active_address: {
      type: Boolean,
      optional: true
    }
    

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

    +

    根据@mark的建议,我添加了defaultValue:[]。它解决了问题。。。某种程度上。现在更新表单中没有“打开”的嵌套模式,可以更改其他值。如果使用“添加”按钮将嵌套模式“添加”到表单中,则即使没有在任何字段中插入任何值,也需要整个表单。无论 Boolean 类型输入。

    我可以确定 布尔型 嵌套模式中的类型输入会导致整个嵌套模式成为执行插入所必需的。删除布尔输入使其再次可插入。因此,同样的情况下也出现了一个新问题。

    可以找到此新问题 here

    1 回复  |  直到 7 年前
        1
  •  1
  •   mark    9 年前

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

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

    请注意,这意味着您必须更新集合中缺少 住址 字段,并将其设置为空数组。在mongo外壳中有这样的东西:

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

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

    编辑

    如果您想要的行为是显示子窗体 没有 如果需要,可以使用 formToDoc 钩子并过滤掉所有只有 active_address 字段设置为 假的 (AutoForm错误地为我们添加的字段)。

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

    这个 表单到文档 每次验证表单时都会调用hook,因此您可以使用它来修改文档,使其成为自动表单,这样AutoForm甚至不会意识到存在地址子字段,除非设置了地址子字段的属性。请注意,如果您使用此解决方案,则无需添加 默认值:[] 如上所述。