2016-12-13 5 views
3

Firebaseデータベースのリスナーをネストしているところがあります。例えば、私は、barsのリストとそれぞれのfoosのリストを持っている、と私は新しいbarがどのfooに追加されるたびに何かをしたい:`child_added`のFirebaseイベントハンドラをクリーンアップしますか?

firebase.database().ref('foos').on('child_added', function(fooSnap) { 
    fooSnap.ref.child('bars').on('child_added', function(barSnap) { 
     // do something with the new bar 
    }); 
}); 

は、これを行うのより良い方法はありますか?

そしてfooが削除された場合は、ネストされたbarchild_addedリスナーはクリーンアップ、または私はどこかchild_removedリスナーに.off(...)を呼ぶべきであるということでしょうか?私はどうしたらいい?

+0

'fooSnap.val()'には、新しいノードのすべての子/サブファイルが含まれていませんか?つまり、内部で同期ループを使用できますか? – qxz

+0

既存のバーに何かしたいのであればうまくいくでしょうが、バーが追加されてもそれを継続的にやりたいのです。通知サーバーまたは検索索引付けを想定します。 – nicholas

答えて

0

通常、NoSQLデータベースでは、よりフラットな設計をすることをお勧めします。たとえば、現在、次のような構造を持っている -

{ 
    "foos": { 
     "F1": { 
      "foo_data": "", 
      "bars": { 
       "B1": { 
        "bar_data": "" 
       }, 
       "B2": { 
        "bar_data": "" 
       } 
      } 
     }, 
     "F2": { 
      "foo_data": "", 
      "bars": { 
       "B1": { 
        "bar_data": "" 
       }, 
       "B2": { 
        "bar_data": "" 
       } 
      } 
     } 
    } 
} 

をしかし、あなたは、次のようにそれを平らにすることができます - あなたが巣にイベントハンドラを必要としない方法

{ 
    "foos": { 
     "F1": { 
      "foo_data": "", 
      "bars": ["B1", "B2"] 
     }, 
     "F2": { 
      "foo_data": "", 
      "bars": ["B3", "B4"] 
     } 
    }, 
    "bars": { 
     "B1": { 
      "bar_data": "" 
     }, 
     "B2": { 
      "bar_data": "" 
     }, 
     "B3": { 
      "bar_data": "" 
     }, 
     "B4": { 
      "bar_data": "" 
     } 
    } 
} 

を。

関連する問題