将某些autovalue键应用于所有SimpleSchemas

时间:2015-05-20 14:00:02

标签: meteor schema

我有一些键,例如createdAt和updatedAt,应该在所有模式中定义。有没有办法避免代码重复?

我使用SimpleSchema包。

我需要在所有Schemas.xxx中使用以下代码

createdAt: {
    type: Date,
    optional: true,
    autoValue: function() {
        if (this.isInsert) {
            return new Date;
        } else if (this.isUpsert) {
            return {$setOnInsert: new Date};
        } else {
            this.unset();
        }
    },
    autoform: {
        type: 'hidden'
    }
},
updatedAt: {
    type: Date,
    optional: true,
    autoValue: function() {
        if (this.isUpdate) {
            return new Date();
        }
    },
    autoform: {
        type: 'hidden'
    }
}

2 个答案:

答案 0 :(得分:1)

我会在这个非常好的软件包的帮助下做到这一点:matb33:collection-hooks这将在你的集合之前和之后添加。所以你可以像这样添加createdAt和updatedAt字段:

对于CollectionName.insert();

CollectionName.before.insert(function (userId, doc) {
    var currentDate = new Date();
    doc.createdAt = currentDate;
    doc.updatedAt = currentDate;    // could be also null if you want
});

因此,在插入生效之前始终触发上面的exmaple。这适用于CollectionName.update();

CollectionName.before.update(function (userId, doc) {
    doc.updatedAt = new Date();
});

每当您更新集合时都会触发此操作。

答案 1 :(得分:1)

创建子架构&然后将它包含在每个集合中,注意SimpleSchema构造函数现在正在采用数组。

Schema._Basic = new SimpleSchema({
  userId: {
    type: String,
    optional: true
  },
  createdAt: {
    type: Date,
    label: 'Created at'
  },
  updatedAt: {
    type: Date,
    label: 'Updated at',
    optional: true
  },
  }
});

Schema.Client = new SimpleSchema([Schema._Basic,
  {
    address: {
      type: String
      optional: true
    }
  }
]);