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

标签 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 };
            });
        }
    }
}

这很好用,使用 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/

相关文章:

javascript - Meteor 0.9.1.1 - 从 json 端点填充到服务器端集合

javascript - meteor JS : Show/Hide leaving blank divs

javascript - 如何等待用户对 Meteor AutoForm 提交的响应?

mongodb - MongoDB 中的文档是什么?

mongodb - 使用 Meteor 从 Mongodb 集合调用 handlebars helper 时没有这样的模板错误

javascript - 如何从 javascript 获取 Meteor 的 MongoDB URL

node.js - 如何使用 mongodb 存储/显示段落?

node.js - STRIPE Con​​nect 没有这样的客户 : cus_XYXXX23

javascript - Meteor autoform 方法更新不起作用

javascript - 在 Meteor 中使用 Flow Router 对路由进行分组