我在Meteor中制作了一种即时即时聊天服务,但我遇到了Meteor中内置元素保存功能的问题。基本上,我需要当前聊天消息div不更新,而其中的文本输入具有焦点。该文档包含以下说明:
手写应用程序中另一个棘手的问题是元素 保存。假设用户在元素中键入文本, 然后重新绘制包含该元素的页面区域。 用户可以进行颠簸,作为焦点,光标 位置,部分输入的文本和重音字符输入 重建时状态将会丢失。
这是Meteor自动解决的另一个问题。做吧 确保您的每个可聚焦元素都具有唯一的ID,或者 具有在具有id的最近父级中唯一的名称。 流星将保留这些元素,即使它们的封闭模板 被重新渲染,但仍将更新他们的孩子并复制任何 属性变化。
按照这些说明,我为输入字段设置了一个唯一的ID,以确保在我输入时不会重新呈现它。但现在我面临以下两个问题:
其他人的聊天消息会在键入时更新,但在我输入自己的消息时此更新会暂停。一旦我停止输入(即使我的输入字段具有焦点),他们的消息也会再次开始更新。
当创建新消息并插入其div时,即使其输入字段具有焦点,我的消息也会更新/重新呈现。这会导致它突然失去焦点。
您可以在http://babble.im的同一聊天室中使用两台不同的计算机/用户对此进行测试。
这是Meteor代码中的错误,还是我自己的错误?我该如何找到?
编辑:
啊,我想我找到了第一个问题的原因:
Meteor通常会批量处理任何所需的更新并仅执行它们 当你的代码没有运行时。这样,你可以确定DOM 不会从你下面改变。有时你想要相反 行为。例如,如果您刚刚在中插入了一条记录 数据库,您可能希望强制DOM更新,以便您可以找到 使用像jQuery这样的库的新元素。在那种情况下,打电话 Meteor.flush立即更新DOM。
我猜我的代码在用户输入时正在运行,因此DOM没有更新。我会尝试使用Meteor.flush
来修复它。现在第二个问题出现了什么?
答案 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中你的问题是否仍然存在!