如果表单输入发生更改,客户端将更新文档,随后将更改的文档写入MongoDB。保存文档不需要进一步提交或保存,这是理想的行为。
如果服务器硬盘足够快,则按预期工作。但是如果硬盘阻塞几秒钟,输入字段将被重置并且键入的字母将丢失。现在我想了解并解决这个问题,因为它永远不会发生 - 甚至不是每周一次 - 输入的字母会丢失(除了浏览器或服务器崩溃)。
我需要改变什么?
我发送每个按键。我应该缓冲几个按键并将它们发送到一个块中吗? Meteor中是否存在内置缓冲解决方案?
硬盘的块是否超过MongoDB或Meteor中的超时并丢弃更改?我在哪里可以找到超时并更改它?
还有什么原因?
答案 0 :(得分:2)
为避免这种情况,您只能在客户端的MiniMongo中存储活动表单数据,并将Session变量与您正在使用的文档的_id保持一致。确定何时应根据应用程序要求保存到服务器,并在此时调用方法以使用客户端的minimongo数据更新服务器集合。使用此模型,您的客户的集合全部都在内存中。
因此,在客户端上,您的更新事件将如下所示:
'keyup input#myinput':function(e){
var modifier = {$set: {'mydata': e.currentTarget.value}};
LocalCollection.update({Session.get('documentId')},modifier);
}
并且您的保存事件将如下所示:
'click btn#save':function(e){
var id= Session.get('documentId');
ServerCollection.upsert({_id: id,LocalCollection.findOne(id)});
}
您可以对其进行扩展以设置保存计时器,或根据许多编辑进行保存。您何时以及如何保存到服务器取决于您,但如果您有大量快速更改,请将其保留在客户端内存中,直到您准备好提交大量新数据为止。