9

たとえば、次のデータベース構造があります。

/ 
+ users
  + 1
    + items
      + -xxx: "hello"
  + 2
    + items

それで;

var usersRef = new Firebase("https://mydb.firebaseio.com/users");
usersRef.on("child_changed", function(snapshot) {
  utils.debug(JSON.stringify(snapshot.exportVal()));
});

値「world」が「/users/1/items」にプッシュされると、次のようになります。

{"items": {"-xxx": "hello", "-yyy": "world"}}

では、どちらが変更されたかをどのように見分けるのでしょうか。

"/users/$id/items" へのすべての参照を on("child_added") する必要がありますか?

注: node.js で管理プロセスを記述しようとしています。

4

2 に答える 2

23

child_changed イベントは、直接の子が変更された情報のみを提供します。データ構造のより深いノードが変更された場合、影響を受けた直下の子はわかりますが、変更されたデータへのフル パスはわかりません。これは仕様によるものです。

正確に何が変更されたかについて詳細な更新が必要な場合は、関心のあるすべての要素にコールバックを再帰的にアタッチする必要があります。そうすれば、アイテムが変更されたときに、コールバックがトリガーされたアイテムが何であったかがわかります。実際、Firebase はこのユースケース向けに最適化されています。多数のコールバック (場合によっては数千もの) をアタッチしても問題なく動作するはずです。バックグラウンドで、Firebase はすべてのコールバックをまとめて集約し、必要な最小限のデータ セットのみを同期します。

たとえば、ユーザーに新しいアイテムが追加されるたびにアラートを受け取りたい場合は、次のようにします。

var usersRef = new Firebase("https://mydb.firebaseio.com/users");
usersRef.on("child_added", function(userSnapshot) {
  userSnapshot.ref().child("items").on("child_added", function(itemSnapshot) 
    utils.debug(itemSnapshot.val());
  });
});

非常に多数のユーザー (数十万または数百万) を扱っていて、すべてのデータを同期することが現実的でない場合は、別の方法があります。サーバーにすべてのデータを直接リッスンさせるのではなく、変更のキューをリッスンさせることができます。次に、クライアントが項目リストに項目を追加するときに、サーバーがそれを認識できるように、このキューに項目を追加することもできます。

クライアント コードは次のようになります。

var itemRef = new Firebase("https://mydb.firebaseio.com/users/MYID/items");
var serverEventQueue = new Firebase("https://mydb.firebaseio.com/serverEvents");
itemRef.push(newItem);
serverEventQueue.push(newItem);

次に、サーバーにそのキューで child_added をリッスンさせ、イベントが発生したときにイベントを処理させることができます。

于 2013-03-01T18:31:05.607 に答える