1

Meteorはリアクティブ更新を約束しているため、データが変更されたときにビューが自動更新されます。含まれているリーダーボードの例は、これを示しています。テストすると正常に動作します。データは、予想どおり、さまざまなブラウザの複数のブラウザタブで更新されます。

すべての準備が整い、meteorでコーディングを開始し、進捗が進んでいましたが、browertab全体のリアクティブな更新をテストしたところ、タブの更新が停止したのはしばらくしてからでした。

新しい空の流星プロジェクトに基づいて、問題を次のコードに要約しました。

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'});
    }
  });
}

複数のbrowsertabで実行し、1つのタブで入力値の変更を開始します。他のタブには変更が反映されます。次のタブに移動して、値を変更します。数回繰り返します。

しばらくすると、他のタブで更新が受信されなくなります。タブが値を変更すると、それ以上の更新を受信/表示しないようです。

リーダーボードの例との違い(非常に似ているため):

  • リーダーボードはフォームコントロールを使用しません
  • リーダーボードの例では、セットではなく、更新時にインクリメント操作を実行します

バグレポートを提出しようとしていますが、ここで愚かなことをしていないこと、またはMeteor Collectionの仕組みの重要な部分が欠落していないことを確認したいと思います(はい、自動公開パッケージがインストールされています)。

4

1 に答える 1

2

ここでの問題は、入力要素の保存です。Meteorは、テンプレートの再描画全体でidor属性を持つ任意のフォームフィールドの入力状態を保持します。name同じフィールドに入力している別のユーザーの邪魔をしたくないので、再描画はフォーム要素の古いテキストを保持します。nameテキストボックスから属性を削除すると、各タブがぼかしで更新されます。

実際、あなたの例で最初の更新が機能する理由はわかりません。それは実際にはバグかもしれません!

各ブラウザでコンソールを開くと、データの問題ではないことがわかります。ぼかしイベントごとに、開いているすべてのタブで更新されたドキュメントを取得します。(タイプItems.find().fetch()

于 2012-04-15T22:28:36.433 に答える