Autoform 中 defaultValue 和 autoValue 的区别?

Difference between defaultValue and autoValue in Autoform?

我正在做一个项目,我开始使用 autoValue 作为

Programs.attachSchema(new SimpleSchema({ createdBy: { type: String, autoValue: function() { return this.userId }, optional: true, autoform: { type: 'hidden' } }, createdAt: { type: Date, label: "Created At", defaultValue: new Date(), optional: true, autoform: { type: 'hidden' } } }));

一切正常,直到我需要其他用户更新信息,比方说管理员,Programs.update 或 Programs.insert 方法将更改电子邮件字段。

我尝试为 createdBy 字段使用默认值,但是

defaultValue: this.userId

return我空

我不被允许使用

defaultValue: Meteor.userId()

谁能解释一下区别?我尝试使用 function() {return this.userId} 作为 defaultValue 仍然没有成功

你应该试试这个片段,

new SimpleSchema({
   // ...
   createdBy: {
      autoValue() {
         return Meteor.userdId();
      }
   }
   // ...
})

现在解释一下,您的问题更可能与 this 绑定有关,this.userId,是从 SimpleSchema 上下文中以这种方式调用的,它没有任何 userId() 方法,在这种情况下你应该使用完整的命名空间 Meteor.userId();

关于 this 绑定的非常酷的解释我推荐你阅读 This binding

defaultValue 被 simple-schema 用来定义默认值。有一些怪癖,所以请阅读文档:https://github.com/aldeed/meteor-simple-schema#defaultvalue

想想代码是运行的时候,你就会明白为什么不能用Meteor.userId()this.userId来代替defaultValue。该架构在启动时 运行 一次。

autoValue 起作用的是它 returns 一个函数。函数是 运行 during db updates/inserts。阅读文档以完全理解它:https://github.com/aldeed/meteor-simple-schema#autovalue

现在,如果我正确理解您的问题,当管理员出现并修改文档时,您遇到 autoValue 问题?导致 createdBy 被设置为管理员的 ID?要解决类似的问题,您只需要更具体地使用 autoValue 函数即可。

查看此代码是否有助于指导您正确的方向:

Programs.attachSchema(new SimpleSchema({
  createdBy: {
    type: String,
    autoValue: function() {
      if (this.isInsert) {
        return this.userId;
      } else if (this.isUpsert) {
        return { $setOnInsert: this.userId };
      }

      this.unset(); // Prevent user from supplying their own value
      return undefined;
    },
    optional: true,
     autoform: {
       type: 'hidden'
     }
  },
  createdAt: {
    type: Date,
    label: 'Created At',
    defaultValue: new Date(),
    optional: true,
    autoform: {
      type: 'hidden'
    },
    autoValue: function() {
      if (this.isInsert) {
        return new Date();
      } else if (this.isUpsert) {
        return { $setOnInsert: new Date() };
      }

      this.unset(); // Prevent user from supplying their own value
      return undefined;
    },
  }
}));