2016-09-04 5 views
1

Firebase ermöglicht die Abfrage eines einzelnen Werts in einer Liste, wenn Sie den Schlüssel kennen. Es scheint jedoch schwierig, einen einzelnen Wert in einer Liste zu erhalten, wenn Sie den Schlüssel nicht haben.Abrufen eines einzelnen Elements aus der Firebase-Liste

Ich konnte das gewünschte Element abrufen, aber die Lösung scheint ausführlich und ein bisschen hacky.

Heres meiner Funktion: (fbutil ist meine Feuerbasis url Referenzbasis)

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

Dieser Code jedoch funktioniert Ich frage mich, ob es ein besserer Weg, um den Artikel zu erhalten. Gibt es eine Firebase-Funktion, die ich vermisse? Oder ein sauberer Weg, um den Artikel zu extrahieren?

Antwort

3

Ihre Funktion könnte etwas einfacher gestaltet werden.

Mit dem Firebase 3 API:

Die once Funktion gibt ein Versprechen, damit Sie Ihre eigene brauchen nicht zu schaffen. Und man konnte die forEach Funktion des Snapshot verwenden, um die Kinder zu aufzählen - true kurzzuschließen die Auszählung nach dem ersten Kind Rückkehr:

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

Mit dem Firebase 2 API:

once nicht zurück ein Versprechen, aber Sie könnten immer noch die forEach Funktion des Snapshots verwenden, um die untergeordneten Elemente aufzuzählen - true zurückgeben, um die Aufzählung nach dem ersten Kind kurzzuschließen:

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

Ich dachte das gleiche, aber "einmal" braucht zwei Argumente, in diesem Fall "Wert" und eine Callback-Funktion. Auch wenn die "Einmal" -Funktion zurückgegeben wird, als wäre sie ein Versprechen, ist sie immer undefiniert. Leider funktioniert das bei mir nicht. –

+0

Der 'successCallback' für' once' ist optional. Wenn es nicht bestanden wird, sollte es ein Versprechen geben. Sie verwenden Firebase 3, richtig? – cartant

+0

Interessant, ich benutze Firebase 2 jedoch, 2.2.2 nach meiner bower.json –

Verwandte Themen