2016-12-13 5 views
3

An einigen Stellen habe ich mich selbst in die Datenbank-Listener von Firebase geschachtelt. Zum Beispiel habe ich eine Liste von foos, jeder mit einer Liste von bars, und ich mag, etwas tun, wenn eine neues bar ein foo hinzugefügt:Firebase Event-Handler in `child_added` bereinigen?

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

Gibt es einen besseren Weg, dies zu tun?

Und wenn ein foo entfernt wird, ist, dass verschachtelte barchild_added Zuhörer gereinigt, oder sollte ich .off(...) in einem child_removed Hörer irgendwo anrufen? Wie würde ich das überhaupt machen?

+0

Enthält 'fooSnap.val()' nicht alle Kinder/Unterkinder des neuen Knotens? Könnten Sie einfach eine synchrone Schleife verwenden? – qxz

+0

Das würde funktionieren, wenn ich etwas mit den vorhandenen Takten machen wollte, aber ich möchte fortfahren, wenn sie hinzugefügt werden. Denken Sie an Benachrichtigungsserver oder Suchindexierung. – nicholas

Antwort

0

Im Allgemeinen ist es in einer NoSQL-Datenbank eine bessere Idee, ein flacheres Design zu haben. Zum Beispiel haben Sie zur Zeit eine Struktur wie -

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

Aber man kann es verflachen wie folgt -

{ 
    "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": "" 
     } 
    } 
} 

diese Weise können Sie nicht über die Event-Handler Nest benötigen.