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;
},
}
}));
我正在做一个项目,我开始使用 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;
},
}
}));