我尝试渲染一个p日历组件。我使用的数据始终是时间戳记(纯数字),而不是Date对象。
我尝试找到一种显示和编辑这些数据的方法,不创建额外的日期字段。 原因是我在应用程序中尝试遵循严格的SSOT原则。
因此,我尝试执行以下操作:
User
我的想法是我将通过单向[ngModel]给出初始值,并且我将使用(onSelect)跟踪将来的更改,以使时间戳保持一致。在该过程中无需创建任何字段。
convertToDate()函数非常简单:
const mongoose = require('mongoose');
const { Schema } = mongoose;
mongoose.Promise = global.Promise;
const md5 = require('md5');
const validator = require('validator');
const mongodbErrorHandler = require('mongoose-mongodb-errors');
const passportLocalMongoose = require('passport-local-mongoose');
// document structure
const userSchema = new Schema({
fullName: {
type: String,
required: 'Please supply a name',
trim: true,
lowercase: true
},
username: {
type: String,
required: 'Please supply a username',
trim: true,
lowercase: true
},
email: {
type: String,
unique: true,
lowercase: true,
trim: true,
validate: [validator.isEmail, 'Invalid Email Address'],
required: 'Please supply an email address'
},
password: {
type: String,
minlength: 6
},
resetToken: String,
resetTokenExpiry: String,
cart: [{
type: mongoose.Schema.ObjectId,
ref: 'CartItem'
}],
createdAt: {
type: Date,
default: Date.now
},
updatedAt: {
type: Date,
default: Date.now
},
permissions: [String],
});
// grab gravatar image based on email addresss
userSchema.virtual('gravatar').get(function() {
const hash = md5(this.email);
return `https://gravatar.com/avatar/${hash}?s=200`;
});
// grab first name and add as virtual field
userSchema.virtual('firstName').get(function() {
return this.fullName.split(' ')[0];
});
// grab last name and add as virtual field
userSchema.virtual('lastName').get(function() {
const names = this.fullName.split(' ');
return names[names.length - 1];
});
// plugins
userSchema.plugin(passportLocalMongoose, { usernameField: 'email' });
userSchema.plugin(mongodbErrorHandler);
function autopopulate(next) {
this.populate('cart');
next();
}
userSchema.pre('find', autopopulate);
userSchema.pre('findOne', autopopulate);
// compile model and export
module.exports = mongoose.model('User', userSchema);
不幸的是,当我执行此操作时,一旦包含上述代码的组件呈现,我的应用程序就会挂起。我没有时间编辑日历或执行任何其他操作。即使我从p日历中删除(onSelect)属性,也会发生挂起。 通过调试,我看到convertToDate()被无休止地调用。只有关闭标签才能使我摆脱困境。有时,整个浏览器会挂起,我必须在任务管理器中将其杀死。
现在,如果我将convertToDate()函数调用替换为实际字段,问题就消失了,但是我放弃了SSOT原则,我非常想坚持。
为什么这个函数总是被调用?我究竟做错了什么? 是否有另一种在我的时间戳上使用p日历且又不违反SSOP的方法? 预先感谢!