流星应用程序中的元素保留错误



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

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

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

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

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

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

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

这是流星代码中的错误,还是我自己的错误?我怎样才能知道?

编辑:

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

Meteor 通常会批量处理任何需要的更新并仅执行它们 当代码未运行时。这样,您可以确定 DOM 不会从你下面换出来。有时你想要相反 行为。例如,如果您刚刚在 数据库,您可能希望强制 DOM 更新,以便您可以找到 使用像jQuery这样的库的新元素。在这种情况下,请致电 Meteor.flush 使 DOM 立即更新。

我猜我的代码在用户打字时正在运行,所以 DOM 没有更新。我会尝试使用Meteor.flush来修复它。现在第二个问题是怎么回事?

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

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

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

最新更新