代码之家  ›  专栏  ›  技术社区  ›  Chris

将对象用作自动窗体中的选项

  •  6
  • Chris  · 技术社区  · 10 年前

    Stacks dimensions 属性定义如下:

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

    这非常有效,使用蒙古语,我可以看到通过表单插入数据的尝试效果很好(在本例中,我选择了两个维度来插入)

    Mongol image

    然而,我真正了解的是存储实际维度对象的数据,而不是它的键。类似这样:

    [ Mongol good[2]

    为了实现这个目标,我改变了 type:[String] type:[DimensionSchema] value: d._id value: d

    然而,当我运行这个时,我在控制台中得到以下错误。

    Meteor当前不支持ObjectID以外的对象作为ID

    四处打转,换衣服 类型:[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"
            }
        }
    })
    
    2 回复  |  直到 10 年前
        1
  •  1
  •   Community Mohan Dere    6 年前

    根据我的经验和经验 this issue ,autoform对对象数组字段不是很友好。

    我通常建议不要以这种方式嵌入这些数据。如果出现以下情况,则数据更难维护 dimension 文档将在以后进行修改。

    • 您可以使用类似的软件包 publish-composite 在发布中创建被动联接,同时只嵌入 _id 中的 stack 文件。
    • PeerDB 包来为您执行反规范化,这也将为您更新嵌套文档。考虑到它有一个学习曲线。
    • 手动编码无法使用AutoForm轻松创建的特定表单。这给了你最大的控制,有时它比所有的修补都容易。

    create a custom input type (通过 AutoForm.addInputType() ),我不推荐。它需要您创建一个模板并修改其 valueOut 方法,并且生成编辑表单不是很容易的。

    由于这是一个特定的用例,我认为最好的方法是使用 修改的模式 并在 流星法 .

    使用字符串数组定义架构:

    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);
      }
    });
    
        2
  •  0
  •   T.Todua Laurent W.    10 年前

    目前我唯一能建议的是(如果价值观不支持 object string (即序列化字符串)并将其设置为“dimensions”键(而不是对象)的值,然后将其保存到数据库中。

    从数据库返回时,只需取消序列化该值( 一串 )到 对象 再一次