18

person可以有多个cars,也car可以有多个accidents。所以我们可以有:

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

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

Firebase 将这些人存储为:

person:
  name: "Misha"

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

因此,在 JavaScript 中,我必须执行以下操作来恢复空数组:(CoffeeScript)

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

有没有更好的方法来处理 Firebase 中的空数组,而无需编写这些不必要的 JavaScript 代码?

4

2 回答 2

13

我认为,如果我理解核心问题,简短的回答是没有办法将一个空数组强制进入 Firebase。但是,有些范例可能比您上面的范例更有效。

请记住,Firebase 是一个实时环境。汽车和事故的数量可以(并且将会)随时变化。最好将一切都视为实时到达的新数据,甚至避免考虑存在或不存在。

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

请注意如何不需要if exists/unless类型逻辑。请注意,您可能还想监视child_removed并调用以停止听特定的孩子。carspeopleref.off()

如果出于某种原因您想坚持使用静态模型,那么forEach将成为您的朋友:

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

        });

   });   
});

请注意,即使使用 forEach,也不需要“存在或除非”这种逻辑。

于 2013-03-14T16:12:47.963 回答
4

我一般用DataSnapshot函数numChildren()看是不是空的不是,像这样

var fire = new Firebase("https://example.firebaseio.com/");
fire.once('value', function(data){if (data.numChildren() > 0){ /*Do something*/ });
于 2013-03-20T02:43:00.873 回答