Meteor 其他浏览器选项卡中未接收到响应式更新

Meteor 其他浏览器选项卡中未接收到响应式更新,meteor,Meteor,Meteor承诺进行反应式更新,以便在数据更改时自动更新视图。附带的排行榜示例演示了这一点。当我测试它时,它运行得很好:正如预期的那样,数据在不同浏览器的多个BrowserTab中更新 一切就绪,我开始使用meteor进行编码,并取得了进展,但当我测试browertabs的反应式更新时,我注意到只有过了一会儿,跨选项卡的更新才停止 基于一个新的空流星项目,我将问题归结为以下代码: updatebug.html <head> <title>updatebug</t

Meteor承诺进行反应式更新,以便在数据更改时自动更新视图。附带的排行榜示例演示了这一点。当我测试它时,它运行得很好:正如预期的那样,数据在不同浏览器的多个BrowserTab中更新

一切就绪,我开始使用meteor进行编码,并取得了进展,但当我测试browertabs的反应式更新时,我注意到只有过了一会儿,跨选项卡的更新才停止

基于一个新的空流星项目,我将问题归结为以下代码:

updatebug.html

<head>
  <title>updatebug</title>
</head>

<body>
  {{> form}}
</body>

<template name="form">
  <form onsubmit="return false;">
  {{#each items}}
    {{> form_item }}
  {{/each}}
  </form>
</template>

<template name="form_item">
  <div>
    <label>{{name}}
      <input type="text" name="{{name}}" value="{{value}}">
    </label>
  </div>
</template>
在多个浏览器选项卡中运行,在一个选项卡中开始更改输入值。其他选项卡将反映更改。转到下一个选项卡并更改值。重复几次

一段时间后,任何其他选项卡都不会再收到更新。似乎选项卡一旦更改了值,就不会再接收/显示任何更新

与排行榜示例相比的差异(因为它非常相似):

  • 排行榜不使用表单控件
  • 排行榜示例在更新时执行增量操作,而不是集合

我即将提交一份错误报告,但我想确保我没有在这里做任何愚蠢的事情,或者遗漏Meteor Collection机制的一个重要部分(是的,安装了autopublish软件包)。

这里的问题是输入元素保存。Meteor将在模板重画中保留任何带有
id
name
属性的表单字段的输入状态。重画将保留表单元素中的旧文本,因为您不想中断其他用户在同一字段中的键入。如果从文本框中删除
name
属性,则每个选项卡将在模糊时更新

事实上,我不确定为什么第一次更新在您的示例中有效。这可能就是问题所在


通过在每个浏览器中打开控制台,可以看出这不是数据问题。在每个模糊事件中,您将在每个打开的选项卡中获得更新的文档。(键入
Items.find().fetch()

感谢您的澄清。我想我错过了关于元素保存的相关部分。
Items = new Meteor.Collection("items");

if (Meteor.is_client) {
  Template.form.items = function () {
    return Items.find();
  };

  Template.form_item.events = {
    'blur input': function(e) {
      var newValue = $(e.target).val();
      console.log('update', this.name, this.value, newValue);
      Items.update({_id: this._id}, {$set: {value: newValue}});
    },
  };
}

if (Meteor.is_server) {
  Meteor.startup(function () {
    if (Items.find().count() === 0) {
      Items.insert({name: 'item1', value: 'something'});
    }
  });
}