2013-03-14 7 views
12

Dire person può avere più cars e car può avere più accidents. Così potremmo avere:Come gestire gli array vuoti in Firebase?

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

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

negozi Firebase queste persone come:

person: 
    name: "Misha" 

e

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

Così in JavaScript che hanno a che fare in seguito per ripristinare le matrici vuote: (CoffeeScript)

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

C'è un modo migliore per gestire gli array vuoti in Firebase senza scrivere questo codice JavaScript inutile?

risposta

13

Penso che, se capisco la domanda principale, la risposta breve è che non c'è modo di forzare un array vuoto in Firebase. Tuttavia, ci sono alcuni paradigmi che potrebbero funzionare meglio di quello che hai sopra.

Ricorda che Firebase è un ambiente in tempo reale. Il numero di auto e incidenti può (e lo farà) cambiare in qualsiasi momento. È meglio trattare tutto come nuovi dati che arrivano in tempo reale ed evitare persino di pensare all'esistenza o non esiste.

// 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 
     }); 
    }); 
}); 

Si noti come non v'è alcuna necessità di if exists/unless Tipo di logica. Si noti che probabilmente si desidera anche monitorare child_removed su cars e people e chiamare ref.off() per interrompere l'ascolto di bambini specifici.

Se per qualche motivo si vuole rimanere con il modello statico, quindi forEach diventerà il vostro amico:

// 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 */ }); 

     }); 

    }); 
}); 

nota come, anche con forEach, non v'è alcuna necessità di "esiste o meno che" sorta di logica.

+0

Grande risposta Kato! –

4

Io di solito uso le numChildren funzione DataSnapshot() per vedere se è vuota non è, come questo

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