Chr*_*ris 6 mongodb meteor meteor-autoform meteor-collection2 simple-schema
在我的Stacks架构中,我有一个dimensions定义如下的属性:
dimensions: {
type: [String],
autoform: {
options: function() {
return Dimensions.find().map(function(d) {
return { label: d.name, value: d._id };
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有效,并且使用Mongol我能够看到通过表单插入数据的尝试运行良好(在这种情况下,我选择了两个要插入的维度)
然而,我真正的是存储实际维度对象而不是密钥的数据.像这样的东西:
[![蒙古好[2]](https://i.stack.imgur.com/cYBCg.png)
要努力实现这一点,我改变了type:[String]对type:[DimensionSchema]和value: d._id对value: d.这里的想法是我告诉表格我期待一个对象,现在我正在返回对象本身.
但是当我运行它时,我在控制台中收到以下错误.
Meteor当前不支持ObjectID以外的对象作为ID
稍微调整一下并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"
}
}
})
Run Code Online (Sandbox Code Playgroud)
根据我的经验和他自己在本期中的经验,autoform 对于对象数组的字段不是很友好。
我通常建议不要以这种方式嵌入这些数据。dimension如果将来修改文档,这会使数据更难以维护。
_ids 嵌入到文档中stack。虽然可以创建自定义输入类型(通过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 };
});
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
然后,渲染一个快速表单,指定模式和方法:
<template name="StacksForm">
{{> quickForm
schema=reducedSchema
id="createStack"
type="method"
meteormethod="createStack"
omitFields="createdAt"
}}
</template>
Run Code Online (Sandbox Code Playgroud)
并定义适当的助手来交付模式:
Template.StacksForm.helpers({
reducedSchema() {
return StacksSchemaSubset;
}
});
Run Code Online (Sandbox Code Playgroud)
在服务器上,定义方法并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);
}
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
230 次 |
| 最近记录: |