Meteor app中的元素保存错误

时间:2012-04-18 04:03:55

标签: meteor

我在Meteor中制作了一种即时即时聊天服务,但我遇到了Meteor中内置元素保存功能的问题。基本上,我需要当前聊天消息div不更新,而其中的文本输入具有焦点。该文档包含以下说明:

  

手写应用程序中另一个棘手的问题是元素   保存。假设用户在元素中键入文本,   然后重新绘制包含该元素的页面区域。   用户可以进行颠簸,作为焦点,光标   位置,部分输入的文本和重音字符输入   重建时状态将会丢失。

     

这是Meteor自动解决的另一个问题。做吧   确保您的每个可聚焦元素都具有唯一的ID,或者   具有在具有id的最近父级中唯一的名称。   流星将保留这些元素,即使它们的封闭模板   被重新渲染,但仍将更新他们的孩子并复制任何   属性变化。

按照这些说明,我为输入字段设置了一个唯一的ID,以确保在我输入时不会重新呈现它。但现在我面临以下两个问题:

其他人的聊天消息会在键入时更新,但在我输入自己的消息时此更新会暂停。一旦我停止输入(即使我的输入字段具有焦点),他们的消息也会再次开始更新。

当创建新消息并插入其div时,即使其输入字段具有焦点,我的消息也会更新/重新呈现。这会导致它突然失去焦点。

您可以在http://babble.im的同一聊天室中使用两台不同的计算机/用户对此进行测试。

这是Meteor代码中的错误,还是我自己的错误?我该如何找到?

编辑:

啊,我想我找到了第一个问题的原因:

  

Meteor通常会批量处理任何所需的更新并仅执行它们   当你的代码没有运行时。这样,你可以确定DOM   不会从你下面改变。有时你想要相反   行为。例如,如果您刚刚在中插入了一条记录   数据库,您可能希望强制DOM更新,以便您可以找到   使用像jQuery这样的库的新元素。在那种情况下,打电话   Meteor.flush立即更新DOM。

我猜我的代码在用户输入时正在运行,因此DOM没有更新。我会尝试使用Meteor.flush来修复它。现在第二个问题出现了什么?

1 个答案:

答案 0 :(得分:2)

第一个问题的原因是Meteor用于在任何方法飞行时冻结对本地数据库缓存的所有更改。 Meteor 0.5.1对此进行了改进,仅冻结对您在本地修改的文档的更改。我怀疑Meteor 0.5.1解决了这个问题。有关详细信息,请参阅http://meteor.com/blog/2012/11/19/latency-compensation-improvements-coming-soon-in-meteor-051

第二个问题可能是由Meteor 0.4.2中添加的preserve-inputs软件包解决的,但如果没有更多详细信息,很难确定。

我很想知道当前版本的Meteor中你的问题是否仍然存在!