2016-07-22 8 views
0
geschachtelt werden

Ich bin neu in Angular - Firebase-Entwicklung, und ich habe Probleme zu verstehen, wie Daten in zwei Sammlungen geschachtelt abrufen. Ich habe eine Sammlung namens "Bestellungen", die einen Feldaufruf "Auth" enthält, die die Benutzer-ID ist, und ich habe eine andere Sammlung, die das "Benutzerprofil" ist, dessen $ ID der Wert von "Auth" ist. Innerhalb des Benutzerprofils habe ich ein Feld namens roomNumber, und es ist Inhalt I, den ich jedes Mal abrufen möchte, wenn ich lese, in ng-Wiederholung der Befehle.wie Daten in zwei Sammlungen von Firebase mit eckigen

Aus meiner Sicht habe ich versucht, so etwas zu tun:

<tr ng-repeat="item in items | filter: searchKeyword "> 
    <td align="left">{{item.$id}} - {{roomNumber(item.$id)}}</td></tr> 

Zimmernummer ist eine Funktion in meinem Controller

$scope.roomNumber = function(id) { 
var rootRef = new Firebase("https://xxxx-fire-yyyy.firebaseio.com/userProfile"+ '/' + id); 
    $scope.userdet = $firebaseArray(rootRef); 
    rootRef.on("value", function(rootSnapshot) { 
     var key = rootSnapshot.key(); 
     var childKey = rootSnapshot.child("room").val(); 
     console.log("room ", childKey) 
    }); 
return childKey 
    } 

Wenn ich diesen Code ausführen und die Ergebnisse in meine js Konsole sehen, seltsame Dinge passiert: 1. Es wiederholt sich oft 2. Ich kann nie den childKey Wert

Ich habe F gelesen irebase Dokumentation, aber wirklich verstehe ich nicht, wie man dieses "dumme" Ding macht, gibt mir jemand einen Tipp, wie man es macht?

enter image description here

+0

Seine andere Firebase Datensammlung – CaribeSoft

Antwort

1

Wenn Sie Binden Sie eine Funktion an den $ scope und rufen Sie sie innerhalb von h auf tml es erwartet eine antwort zurück sofort beim anruf. Also, wenn Sie Firebase abfragen und es dauert seine süße Zeit bekommen Sie eine Antwort zurück, Angularjs hat bereits eine Antwort von undefined von der Funktion erhalten.

Also, was passiert ist, dass Sie einen Rückruf registrieren, wenn Sie die Funktion auf rootRef.on und dann direkt nach der Registrierung des Rückrufs geben Sie den Wert von childKey zurück. Leider wird childKey nur von der Callback-Funktion gesetzt (welche Firebase noch nicht ausgeführt wurde). Daher erhält angularjs eine Antwort von undefined von Ihrer roomNumber Funktion.

Um diese Arbeit zu machen, werden Sie die Zimmernummern vorher und dann wahrscheinlich sie dann

<td align="left">{{item.$id}} - {{item.room}}</td></tr> 

statt

verwenden, um jedes Ihrer Produkte in $ scope.items bekommen zu müssen hinzufügen
<td align="left">{{item.$id}} - {{roomNumber(item.$id)}}</td></tr> 

alle Raumnummern laden Sie nach $ eine Funktion wie diese nennen könnte scope.items

for (var i = 0; i < $scope.items.length; i++) { 
    var rootRef = new Firebase("https://xxxx-fire-yyyy.firebaseio.com/userProfile"+ '/' + $scope.items[i].$id); 
    $scope.userdet = $firebaseArray(rootRef); 
    rootRef.on("value", function(rootSnapshot) { 
     var key = rootSnapshot.key(); 
     var childKey = rootSnapshot.val().room; 
     $scope.items[i].room = childKey; 
    }); 
} 
geladen ist

Es würde jeden Gegenstand ändern, um einen Bezug zum Raum zu haben. Leider wird diese Liste nicht aktualisiert, wenn die Daten aktualisiert werden. Daher wäre es die bessere Lösung, dieselbe Abfrage in jeder Funktion auszuführen, die Ihre Objekte vom Server bezieht, und den Raum zu jedem Objekt hinzuzufügen, wenn es der Elementliste hinzugefügt wird .

+0

Danke Davis, deine Kommentare lassen mich anders denken und zuerst bemerke ich einen Fehler, ich habe chilKey als globale Variable innerhalb der Referenz deklariert, also dekleariere ich es vor der Firebase-Referenz und es funktioniert. Auch habe ich eine Änderung an meiner App vorgenommen, ich speichere das Raumfeld in der "Orders" Sammlung und dieser Weg ist einfach zu bekommen, wenn ich die Daten durchsuche. – CaribeSoft

+0

Ich bin froh, dass es funktioniert. Es tut mir leid, dass ich keine vollständige Antwort gegeben habe, aber ich habe versucht, von dem von Ihnen bereitgestellten Code abzugehen. – Davis

0

Um das Problem zu beheben, mit childKey Sie nicht lesen müssen verwenden:

var childKey = rootSnapshot.val().room; 

statt dessen:

var childKey = rootSnapshot.child("room").val(); 
console.log("room ", childKey) 

Referenz: https://www.firebase.com/docs/web/guide/retrieving-data.html

+0

Hallo Frank, danke für deine schnelle Antwort, aber es gibt immer noch nicht den Wert von childKey, das ist der Raum. Halten Sie es für eine gute Methode, diese Methode zu verwenden: {{Element. $ Id}} - {{roomNumber (item. $ id)}}? Ich lese gerade einen anderen Artikel, der besagt, dass dieser Weg viele Ressourcen des Servers in Anspruch genommen hat, ist das wahr? – CaribeSoft

+0

Ich habe nicht wirklich herausgefunden, was deine Frage war, als ich meine Antwort zum ersten Mal gepostet habe. Ich werde schnell eine neue Antwort veröffentlichen, die hoffentlich ein bisschen besser klärt. – Davis

Verwandte Themen