2016-09-04 9 views
1

Firebaseでは、キーであることがわかっていればリスト内の単一の値を問い合わせることができます。しかし、キーを持っていなければ、リスト内の単一の値を得るのは難しいようです。firebaseリストから単一のアイテムを取得する

私は希望のアイテムを取得することができましたが、解決策は冗長で少しハッキリです。

HERESに私の機能: (fbutilは私firebase URL参照ベースです)

function getCopy(number){ 
     var defer = $q.defer(); 
     var ref = fbutil.ref('copies').orderByChild("number").equalTo(number); 
     ref.once("value",function(copySnap){ 
     if(!copySnap.exists()){ 
      defer.reject(null); 
     }else{ 
      var listObj = copySnap.val(); 
      var list = Object.keys(listObj).map(function(copy){ 
       return listObj[copy]}); 
      defer.resolve(list[0]); 
     } 
     }) 
     return defer.promise; 
    } 

このコードは、しかし、アイテムを入手するためのより良い方法があれば、私は不思議に動作しません。私が行方不明の火災基地の機能はありますか?またはアイテムを抽出するクリーナーの方法?

答えて

3

あなたの機能は少しシンプルにできます。 Firebase 3 APIで

once機能は約束を返すので、あなた自身を作成する必要はありません。そして、あなたは子供を列挙するために、スナップショットのforEach機能を使用することができます - 最初の子の後に短絡列挙にtrueを返す:Firebase 2 APIで

function getCopy (number) { 
    var ref = fbutil.ref('copies').orderByChild("number").equalTo(number); 
    return ref.once("value").then(function (copiesSnap) { 
    var result = null; 
    copiesSnap.forEach(function (copySnap) { 
     result = copySnap.val(); 
     return true; 
    }); 
    return result; 
    }); 
} 

onceは戻りません。スナップショットのforEach関数を使用して子を列挙することができます - trueを返して、最初の子の後に列挙を短絡します。

function getCopy (number) { 
    var defer = $q.defer(); 
    var ref = fbutil.ref('copies').orderByChild("number").equalTo(number); 
    ref.once("value", function (copiesSnap) { 
    var result = null; 
    copiesSnap.forEach(function (copySnap) { 
     result = copySnap.val(); 
     return true; 
    }); 
    defer.resolve(result); 
    }); 
    return defer.promise; 
} 
+0

私は同じことを考えましたが、 'once'は2つの引数、この場合は "value"とコールバック関数を必要とします。 'once'関数を約束のように返すときも、常に未定義です。残念ながら、これは私にとってはうまくいきません。 –

+0

'once'の' successCallback'はオプションです。それが渡されなければ、それは約束を返すべきです。 Firebase 3を使用しています。 – cartant

+0

興味深いですが、私はfirebase 2を使っていますが、私のbower.jsonによれば2.2.2です。 –

関連する問題