Meteor承诺反应更新,以便在数据更改时自动更新视图。包含的排行榜示例演示了这一点。它在我测试时运行正常:数据在不同浏览器中的几个browsertabs上更新,如预期的那样。
所有设置和开始,我开始使用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>
updatebug.js:
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'});
}
});
}
在多个browsertabs中运行,开始在一个选项卡中更改输入的值。其他选项卡将反映更改。转到下一个选项卡并更改值。重复几次。
一段时间后,任何其他标签都不会再收到任何更新。似乎一旦标签更改了值,它就不会再接收/显示更新。
与排行榜示例相比的差异(因为它非常相似):
我即将提交一份错误报告,但我想确定我在这里没有做任何愚蠢的事情,或者错过了Meteor Collection机制的基本部分(是的,安装了autopublish包)。
答案 0 :(得分:2)
这里的问题是输入元素保存。 Meteor将保留任何表单字段的输入状态,并在模板重绘中使用id
或name
属性。重绘是保留表单元素中的旧文本,因为您不希望中断键入同一字段的其他用户。如果您从文本框中删除name
属性,则每个标签都会在模糊时更新。
事实上,我不确定为什么第一次更新在您的示例中有效。这实际上可能就是错误!
通过在每个浏览器中打开控制台,您可以看到它不是数据问题。在每个模糊事件中,您将在每个打开的选项卡中获得更新的文档。 (输入Items.find().fetch()
)