18

複数の を持つことができ、person複数の を持つことができるとします。したがって、次のようになります。carscaraccidents

# 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 = []

この不必要な JavaScript コードを記述せずに、Firebase で空の配列を処理するより良い方法はありますか?

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型ロジックが必要ないことに注意してください。特定の子のリスニングを停止するために on を監視child_removedcarsたりpeople、呼び出したりすることもあることに注意してください。ref.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 に答える