2017-03-04 1 views
0

ich die Datenbank abfragen, indem userkey zu finden, wenn ein zugehöriges Objekt vorhanden ist:Wie erhält man den Objektschlüssel des zugehörigen Objekts in angularFire2?

let url = ``/userMember/${userKey}``;

const userMemberRef = this.af.database.object(url, { preserveSnapshot: true }); 

userMemberRef.subscribe(data => { 
    if(data.val()!=null) { 
    console.log(data.val()); 
    memberKey= data.val(); 
    } 
}); 
return memberKey; 

Es protokolliert diese in der Konsole, was gut ist, weil die Daten, die ich dort will.

Object {-Ke2CyV2BJ5S3_7qcQj5: true}

Aber wie kann ich das Kind Schlüsselwert "-Ke2CyV2BJ5S3_7qcQj5" zurückzukehren?

Scheint sehr trivial zu sein. Ich schätze Ihre Hilfe!

+0

Hier ist "subscribe" asynchron, daher geben Sie "memberKey" zurück, bevor ihm ein Wert zugewiesen wurde. Siehe http://stackoverflow.com/a/6847754/6680611 – cartant

+0

Also, was ist die Lösung, um den Wert zu erhalten? Ich dachte, der Abonnent wird es auspacken. Ich brauche den Wert auszupacken, wie es von der verbrauchenden Methode benötigt wird. – alltej

Antwort

1

data.val() verweist tatsächlich auf den Wert von userKey. Da userMember/${userKey} kein Pfad zu einem Schlüsselwertpaar ist, sondern ein Objekt, ist der "Wert" userKey dieses Objekt. Wenn Sie den Schlüssel einer Eigenschaft dieses Objekts einer Variablen zuweisen möchten, müssen Sie dem Schlüssel der Eigenschaft zuordnen.

Da es sicher ist anzunehmen, dass Sie nicht vorhersagen können, was dieser Schlüssel sein wird, gibt es keine direkte Möglichkeit, dies zu tun, soweit ich weiß. Auf der positiven Seite gibt es eine Reihe von denkbaren Möglichkeiten, dies zu tun. Das Wichtigste ist, dass Sie das oben Gesagte verstehen.

Die Tatsache, dass Sie keine direkte Möglichkeit haben, auf diesen Schlüssel zuzugreifen und möchten, könnte ein Hinweis darauf sein, dass Sie die Struktur Ihres Modells wenn überhaupt möglich überdenken sollten.

Ich werde Sie mit diesem Beispiel lassen, wie der Schlüssel zum „bei bekommen“, vor allem seine Beziehung zu dem Weg zu veranschaulichen Sie verwenden:

this.af.database.object(`userMember/${userKey}`) 
.subscribe(member => console.log(Object.keys(member)[0])); 
+0

Die Syntax, die für mich funktioniert, ist 'console.log (Object.keys (member.val()) [0]);' – alltej

+0

Ich nehme an, weil Sie 'preserveSnapshot' verwenden. Hast du versucht, die Schlüssel ohne es zu loggen? –

1

verwenden nur

const key = object['$key']; 
+0

BANG! Sie ein Chef: D das ist imho die eleganteste Lösung – Unispaw

Verwandte Themen