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