次のクライアント側コードがあります (2 つのコレクションA
とB
):
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
コレクションの両方の変更に反応するテンプレートがあるクライアントで発生します。
テンプレートは次のように反応します。
- レイテンシー補正メカニズムに基づいてすぐに再描画され、両方のコレクションの正しい変更が表示されます。
- その後すぐに、再び再描画しますが、変更はありません (拒否されたかのように)。
- その後、自動的に更新されなくなります。しかし、更新ボタンを押すと、テンプレートがもう一度再描画され、正しく更新されたコレクション (
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 に新しい要素を挿入すると、上記の奇妙な動作が発生する理由でしょうか?