p日历:单向有界ngmodel导致应用程序挂起

时间:2018-11-26 17:56:09

标签: angular primeng

我尝试渲染一个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的方法? 预先感谢!

0 个答案:

没有答案