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 をリッスンさせ、イベントが発生したときにイベントを処理させることができます。