更新时需要 AutoForm 5.0.2 嵌套模式输入
AutoForm 5.0.2 nested schema inputs required on update
我设置了模式,这样我就可以拥有一组复杂的输入集。类似于:
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
类型的自动表单。进行更新时,none 个字段将提交,除非嵌套模式中的 所有 个必填字段也有效。
作为参考,我正在创建这样的表格:
{{#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:[]。它解决了这个问题......有点。现在更新表单中没有 "open" 嵌套模式,可以更改其他值。如果您 "add" 使用添加按钮将嵌套模式添加到表单,则即使您没有在任何字段中插入任何值,整个表单也将成为必需的。无论 Boolean
类型输入如何,都会发生这种情况。
我可以确定嵌套模式中的 Boolean
类型输入导致整个嵌套模式成为执行插入所必需的。删除布尔输入导致它再次可插入。因此,同样有一个新问题。
可以找到这个新问题here
我认为最好的解决方案是在架构中的 address
字段中添加一个 defaultValue: []
。您在问题中描述的行为(不允许更新)实际上是有意的——请继续阅读以了解原因。
事实是,仅当数组表单元素已添加到表单时才会存在此行为。我的意思是,如果您单击从表单中删除街道、城市等输入的减号,则更新会成功,因为 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
挂钩,因此您可以使用它来修改文档,使 AutoForm 永远不会意识到有地址子字段,除非其中一个 属性 已设置。请注意,如果您使用此解决方案,则不必如上所述添加 defaultValue: []
。
我设置了模式,这样我就可以拥有一组复杂的输入集。类似于:
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
类型的自动表单。进行更新时,none 个字段将提交,除非嵌套模式中的 所有 个必填字段也有效。
作为参考,我正在创建这样的表格:
{{#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:[]。它解决了这个问题......有点。现在更新表单中没有 "open" 嵌套模式,可以更改其他值。如果您 "add" 使用添加按钮将嵌套模式添加到表单,则即使您没有在任何字段中插入任何值,整个表单也将成为必需的。无论 Boolean
类型输入如何,都会发生这种情况。
我可以确定嵌套模式中的 Boolean
类型输入导致整个嵌套模式成为执行插入所必需的。删除布尔输入导致它再次可插入。因此,同样有一个新问题。
可以找到这个新问题here
我认为最好的解决方案是在架构中的 address
字段中添加一个 defaultValue: []
。您在问题中描述的行为(不允许更新)实际上是有意的——请继续阅读以了解原因。
事实是,仅当数组表单元素已添加到表单时才会存在此行为。我的意思是,如果您单击从表单中删除街道、城市等输入的减号,则更新会成功,因为 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
挂钩,因此您可以使用它来修改文档,使 AutoForm 永远不会意识到有地址子字段,除非其中一个 属性 已设置。请注意,如果您使用此解决方案,则不必如上所述添加 defaultValue: []
。