在我的 Stacks
架构中,我有一个 dimensions
属性定义如下:
dimensions: {
type: [String],
autoform: {
options: function() {
return Dimensions.find().map(function(d) {
return { label: d.name, value: d._id };
});
}
}
}
这很好用,使用 Mongol 我可以看到尝试通过表单插入数据效果很好(在这种情况下,我选择了二维插入)
但是,我真正了解的是存储实际维度对象的数据,而不是关键。像这样的:
[
为了实现这一点,我将 type:[String]
更改为 type:[DimensionSchema]
并将 value: d._id
更改为 值:d
。这里的想法是我告诉表单我期待一个对象并且现在返回对象本身。
但是,当我运行它时,我的控制台中出现以下错误。
Meteor does not currently support objects other than ObjectID as ids
稍微摸索一下并将 type:[DimensionSchema]
更改为 type: DimensionSchema
我在控制台中看到了一些新错误(可能在 type
是一个数组
因此,autoform 似乎正在尝试获取我想要存储在数据库中的值并尝试将其用作 id。对最好的方法有什么想法吗?
引用这里是我的 DimensionSchema
export const DimensionSchema = new SimpleSchema({
name: {
type: String,
label: "Name"
},
value: {
type: Number,
decimal: true,
label: "Value",
min: 0
},
tol: {
type: Number,
decimal: true,
label: "Tolerance"
},
author: {
type: String,
label: "Author",
autoValue: function() {
return this.userId
},
autoform: {
type: "hidden"
}
},
createdAt: {
type: Date,
label: "Created At",
autoValue: function() {
return new Date()
},
autoform: {
type: "hidden"
}
}
})
最佳答案
根据我的经验,在 this issue , autoform 对于对象数组的字段不是很友好。
我通常建议不要以这种方式嵌入这些数据。如果将来修改了 dimension
文档,这会使数据更难维护。
替代方案
- 您可以使用像 publish-composite 这样的包在发布中创建响应式连接,同时仅将
_id
嵌入到stack
文档中。 - 您可以使用 PeerDB 之类的东西包为您进行反规范化,这也将为您更新嵌套文档。考虑到它有一个学习曲线。
- 手动对 AutoForm 无法轻松创建的特定表单进行编码。这为您提供了最大程度的控制,有时它比所有的修补都更容易。
如果你坚持使用 AutoForm
虽然有可能 create a custom input type (通过 AutoForm.addInputType()
),我不会推荐它。它需要您创建一个模板并在其 valueOut
方法中修改数据,并且生成编辑表单并不容易。
由于这是一个特定的用例,我认为最好的方法是使用稍微修改过的架构并在 Meteor 方法中处理数据。
使用字符串数组定义模式:
export const StacksSchemaSubset = new SimpleSchema({
desc: {
type: String
},
...
dimensions: {
type: [String],
autoform: {
options: function() {
return Dimensions.find().map(function(d) {
return { label: d.name, value: d._id };
});
}
}
}
});
然后,渲染一个 quickForm,指定一个模式和一个方法:
<template name="StacksForm">
{{> quickForm
schema=reducedSchema
id="createStack"
type="method"
meteormethod="createStack"
omitFields="createdAt"
}}
</template>
并定义适当的帮助器来传递架构:
Template.StacksForm.helpers({
reducedSchema() {
return StacksSchemaSubset;
}
});
在服务器上,在插入之前定义方法并改变data
。
Meteor.methods({
createStack(data) {
// validate data
const dims = Dimensions.find({_id: {$in: data.dimensions}}).fetch(); // specify fields if needed
data.dimensions = dims;
Stacks.insert(data);
}
});
关于mongodb - 在 Autoform 中使用对象作为选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38807054/