如何在对象中保存/更新对象并在对象中嵌入对象?

时间:2017-02-23 03:52:54

标签: mongodb meteor meteor-autoform meteor-methods

我有两个颜色和汽车系列。 在车里可能选择颜色。

如何在集合中保存/更新对象,以便在Car对象中嵌入Color对象?

 Cars = new Mongo.Collection('cars');
    Cars.attachSchema(new SimpleSchema({
        colorId: {
            label: 'Color',
            type: String,
            autoform: {
                options: function () {
                    return Colors.find().map(function (p) {
                        return {label: p.colorName, value: p._id};
                    });
                },
                label: false
            }
        },

        color: {
            type: Object,
        },
        'color._id': {
            type: String,
            autoform: {
                omit: true,
            },
        },
        'color.colorName': {
            type: String,
            autoform: {
                omit: true,
            },
        },
        'color.colorCode': {
            type: String,
            autoform: {
                omit: true,
            },
        },
    }));


Colors = new Mongo.Collection('colors');
Colors.attachSchema(new SimpleSchema({
    colorName: {
        type: String,
        label: "Color Name",
        max: 20,
    },
    colorCode: {
        type: String,
        optional: true,
        label: "Color Code",
        autoform: {
            afFieldInput: {
                type: "color"
            }
        }
    },
}));

我尝试使用 AutoForm.hooks({insertCarForm:{before:{

但它无效

1 个答案:

答案 0 :(得分:1)

有几种方法可以实现这一点,解决方案很大程度上取决于您可能正在使用的任何相关软件包。如果没有看到创建新卡的现有代码,那么很难给出一个有效的例子。不过,这里有一个使用核心Meteor API的例子。

  1. 假设您已经定义了一些模板(我称之为' manageCar'),您可以这样做。
  2. 定义一个Meteor方法来处理插入/更新Car。

    Meteor.methods({
      updateCar: function(carDoc) {
        check(carDoc, { /* carDoc schema */ });
    
        const color = Colors.findOne(carDoc.colorId);
        carDoc.color = color;
    
        if (carDoc._id) {
          Cars.update(carDoc._id, {
            $set: {
              colorId: carDoc.colorId,
              color: carDoc.color,      
            }
          })
        } else {
          Cars.insert(carDoc);
        }
      },
    });
    

    为表单提交添加一个事件处理程序,用于调用已定义的Method。

    Template.manageCar.events({
      'click .js-save-car'(event, instance) {
        const data = {
          _id: event.target._id.value,
          colorId: event.target.colorId.value
        };
    
        Meteor.call('updateCar', data, function(error, result) {
          if (!error) {
            alert('Car updated successfully');
          }
        });
      }  
    });
    

    简而言之,您只需要确保您可以访问为Car保存的Color ID,然后确保在Color集合上执行查找以检索必要的Color文档,然后将其用于您的汽车插入或更新。

    如果您有任何问题或需要进一步解释,请与我们联系。