我已经设置了模式,以便我可以拥有一组复杂的输入集。类似的东西:
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
答案 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: []
。