2013-03-14 10 views
12

Say person kann mehrere cars haben, und car kann mehrere accidents haben. So konnten wir haben:Wie behandelt man leere Arrays in Firebase?

# Person with no cars 
person: 
    name: "Misha" 
    cars: [] 

# Person with free-accident car 
person: 
    name "Arlen" 
    cars: 
    0: 
     name: "Toyota" 
     accidents: [] 

Firebase speichert diese Leute als:

person: 
    name: "Misha" 

und

person: 
    name "Arlen" 
    cars: 
    0: 
     name: "Toyota" 

So in JavaScript ich zu tun, im Anschluss an die leere Arrays wiederherzustellen: (Coffee)

if person.cars? 
    for car in person.cars 
    car.accidents = [] unless car.accidents? 
else 
    person.cars = [] 

Gibt es eine bessere Möglichkeit, leere Arrays in Firebase zu verarbeiten, ohne diesen unnötigen JavaScript-Code zu schreiben?

Antwort

13

Ich denke, wenn ich die Kernfrage verstehe, ist die kurze Antwort, dass es keine Möglichkeit gibt, ein leeres Array in Firebase zu erzwingen. Es gibt jedoch einige Paradigmen, die besser funktionieren als das, was Sie oben haben.

Denken Sie daran, dass Firebase eine Echtzeitumgebung ist. Die Anzahl der Autos und Unfälle kann (und wird) sich jederzeit ändern. Es ist am besten, alles als neue Daten zu behandeln, die in Echtzeit ankommen und es vermeiden, überhaupt darüber nachzudenken, ob es existiert oder nicht existiert.

// fetch all the people in real-time 
rootRef.child('people').on('child_added', function(personSnapshot) { 

    // monitor their cars 
    personSnapshot.ref().child('cars', 'child_added', function(carSnapshot) { 

     // monitor accidents 
     carSnapshot.ref().child('accidents', 'child_added', function(accidentSnapshot) { 
      // here is where you invoke your code related to accidents 
     }); 
    }); 
}); 

Beachten Sie, wie es keine Notwendigkeit für if exists/unless Typ-Logik ist. Beachten Sie, dass Sie wahrscheinlich auch child_removed unter cars und people überwachen und ref.off() anrufen möchten, um bestimmte Kinder nicht mehr zu hören.

Wenn Sie aus irgendeinem Grund mit dem statischen Modell bleiben wollen, dann forEach wird Ihr Freund geworden:

// fetch all the people as one object, asynchronously 
// this won't work well with many thousands of records 
rootRef.child('people').once('value', function(everyoneSnap) { 

    // get each user (this is synchronous!) 
    everyoneSnap.forEach(function(personSnap) { 

     // get all cars (this is asynchronous) 
     personSnap.ref().child('cars').once('value', function(allCars) { 

      // iterate cars (this is synchronous) 
      allCars.forEach(function(carSnap) { /* and so on */ }); 

     }); 

    }); 
}); 

Beachten Sie, wie auch bei forEach, gibt es keine Notwendigkeit für ist eine Art „oder es sei denn, existiert“ Logik.

+0

Große Antwort Kato leer ist! –

4

Normalerweise verwende ich die DataSnapshot Funktion numChildren(), um zu sehen, wenn es nicht, wie diese

var fire = new Firebase("https://example.firebaseio.com/"); 
fire.once('value', function(data){if (data.numChildren() > 0){ /*Do something*/ }); 
Verwandte Themen