流星集合Simpleschema,自动值取决于其他字段值

时间:2018-10-24 11:40:15

标签: javascript node.js meteor simple-schema meteor-collection2

我在一个集合中有三个字段:

Cards.attachSchema(new SimpleSchema({
  foo: {
    type: String,
  },
  bar: { 
    type: String,
  },
  foobar: {
    type: String,
    optional: true,
    autoValue() { 
      if (this.isInsert && !this.isSet) {
        return `${foo}-${bar}`;
      }
    },
  },
);

因此,我想让foobar字段作为auto(或默认)值(如果未显式设置)以返回foo和bar的值。这可能吗?

1 个答案:

答案 0 :(得分:1)

您可以在this.field()函数中使用autoValue方法:

Cards.attachSchema(new SimpleSchema({
  foo: {
    type: String,
  },
  bar: { 
    type: String,
  },
  foobar: {
    type: String,
    optional: true,
    autoValue() { 
      if (this.isInsert && !this.isSet) {
        const foo = this.field('foo') // returns an obj
        const bar = this.field('bar') // returns an obj
        if (foo && foo.value && bar && bar.value) {
          return `${foo.value}-${bar.value}`;
        } else {
          this.unset()
        }
      }
    },
  },
);

相关阅读:https://github.com/aldeed/simple-schema-js#autovalue

但是,您也可以通过集合中的using a hook on the insert method解决此问题。在那里,您可以假设存在值foobar,因为您的架构要求它们:

Cards.attachSchema(new SimpleSchema({
  foo: {
    type: String,
  },
  bar: { 
    type: String,
  },
  foobar: {
    type: String,
    optional: true,
  },
);



Cards.after.insert(function (userId, doc) {
   // update the foobar field depending on the doc's 
   // foobar values
});