gpt4 book ai didi

mongodb - 在 Autoform 中使用对象作为选项

转载 作者:IT老高 更新时间:2023-10-28 13:29:57 25 4
gpt4 key购买 nike

在我的 Stacks 架构中,我有一个 dimensions 属性定义如下:

dimensions: {
type: [String],
autoform: {
options: function() {
return Dimensions.find().map(function(d) {
return { label: d.name, value: d._id };
});
}
}
}

这很好用,使用 Mongol 我可以看到尝试通过表单插入数据效果很好(在这种情况下,我选择了二维插入)

Mongol image

但是,我真正了解的是存储实际维度对象的数据,而不是关键。像这样的:

[ Mongol good[2]

为了实现这一点,我将 type:[String] 更改为 type:[DimensionSchema] 并将 value: d._id 更改为 值:d。这里的想法是我告诉表单我期待一个对象并且现在返回对象本身。

但是,当我运行它时,我的控制台中出现以下错误。

Meteor does not currently support objects other than ObjectID as ids

稍微摸索一下并将 type:[DimensionSchema] 更改为 type: DimensionSchema 我在控制台中看到了一些新错误(可能在 type 是一个数组

console image

因此,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com