我有一个流星应用程序,允许用户更新他们的Skype名称,电话号码,电子邮件地址等。为了帮助维护一致的代码库,我在公共目录中实现了一个EJSON类型的UserModel,以便它可以在客户端上运行和服务器。
EJSON.addType("UserModel", function fromJSONValue(value) {
return new UserModel(value);
});
UserModel.prototype = {
constructor: UserModel,
//
// EJSON Ovverrides.
//
valueOf: function() {
return JSON.parse(JSON.stringify(this), function(key, value) {
var dateFields = ["expiration", "createdAt"];
if(_.contains(dateFields, key) && typeof value === "string") {
return new Date(value);
} else {
return value;
}
});
},
typeName: function() {
return 'UserModel';
},
toJSONValue: function() {
return this.valueOf();
},
clone: function() {
return new UserModel(this.valueOf());
},
equals: function(other) {
if(!(other instanceof UserModel)) {
return false;
}
return this._id === other._id;
},
setPhoneNumbers: function(phoneNumber, queueUpdate) {
var modifier = {$set: {
'profile.phoneNumber': phoneNumber
}};
this.profile.phoneNumber = phoneNumber;
return this._saveOrQueueUpdate(modifier, queueUpdate);
},
_saveOrQueueUpdate: function(modifier, queueUpdate) {
if (!queueUpdate) {
return Meteor.users.update(this._id, modifier, function(err, res) {
});
} else {
this.pendingUpdates.push(modifier);
return true;
}
}
我在设置页面js文件中调用setPhoneNumbers
方法,如此。
'blur #phonenumber':function(){
var user = Meteor.user();
var number = $("#phonenumber").val();
if(number.length){
user.setPhoneNumbers(number);
}
}
问题在于,无论何时调用setPhoneNumbers
方法,页面都需要> 500毫秒才能更新并锁定整个页面。我查看了文档,根据this segment,客户端代码永远不会被阻止。该页面仅在更新发生时锁定,因此我知道它与UserModel有关。任何可能导致这种情况的见解都会非常有帮助。页面非常慢,对于生产应用程序来说是不可接受的。