1

次のクライアント側コードがあります (2 つのコレクションAB):

var id = A.insert({name: 'new element of A');
var b = B.findOne({name: 'parent of new element of A'});
B.update(b._id, { $set: { child: id } });

上記のコードは正常に動作します。つまり、サーバー側のコレクションが正しく更新されます。Aこの問題は、とBコレクションの両方の変更に反応するテンプレートがあるクライアントで発生します。

テンプレートは次のように反応します。

  1. レイテンシー補正メカニズムに基づいてすぐに再描画され、両方のコレクションの正しい変更が表示されます。
  2. その後すぐに、再び再描画しますが、変更はありません (拒否されたかのように)。
  3. その後、自動的に更新されなくなります。しかし、更新ボタンを押すと、テンプレートがもう一度再描画され、正しく更新されたコレクション (Aとの両方B)が表示されるようになりました。

2 回目の更新では、コレクションの 1 つ (親B) のみが更新され、テンプレートには一貫性のないデータが表示されます (更新が行われていないかのように)。

これは、クライアント側のテンプレートを混乱させて、両方のコレクションを同時に更新する単一のトランザクションをここで扱っていないためだと思います。

どうすればこれを解決できますか?

編集:

私の場合、子データベースへの 2 つの補完的なサブスクリプションがあることを追加する必要があります。

var A = new Meteor.Collection('children');

handle1 = Meteor.subscribe('children1');
handle2 = Meteor.subscribe('children2');

そしてサーバー上で

Meteor.publish('children1', function () {
    return A.find({ sex: male });
}
Meteor.publish('children2', function () {
    return A.find({ sex: female });
}

これが、A に新しい要素を挿入すると、上記の奇妙な動作が発生する理由でしょうか?

4

1 に答える 1

0

1つのコマンドですべてを実行すると、よりうまく機能する可能性があります

B.update({name: 'parent of new element of A'}, { $set: { child: A.insert({name: 'new element of A') } });

IDに基づいて更新しないため、これをメソッドに入れる必要があります

Deps.flush()操作の後に手動で呼び出すこともできますが、これは必要ありませんが、試してみる必要があります

于 2013-04-26T15:02:08.640 に答える