在Autoform中使用对象作为选项

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]

要努力实现这一点,我改变了type:[String]type:[DimensionSchema]value: d._idvalue: 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)

Mas*_*rAM 1

根据我的经验和他自己在本期中的经验,autoform 对于对象数组的字段不是很友好。

我通常建议不要以这种方式嵌入这些数据。dimension如果将来修改文档,这会使数据更难以维护。

备择方案

  • 您可以使用像publish-composite这样的包在发布中创建反应式连接,同时仅将_ids 嵌入到文档中stack
  • 您可以使用PeerDB包之类的东西来为您进行反规范化,这也将为您更新嵌套文档。考虑到它有一个学习曲线。
  • 对使用 AutoForm 无法轻松创建的特定表单进行手动编码。这为您提供了最大程度的控制,有时比所有的修补都更容易。

如果您坚持使用 AutoForm

虽然可以创建自定义输入类型(通过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)