Mehrere AngularJS-get-Anfragen in einem Modell
Gibt es eine Möglichkeit zu nennen, eine unbekannte Menge von API-aufrufen einer URL über die get()
Funktion in AngularJS und fügen Sie Sie alle in ein Modell ($scope
variable). Was ich getan habe, so weit ist die folgende:
if(theUIDS != "") {
var myDropbox = [];
for(i = 0; i < theUIDS.length; i++) {
var temp = {};
temp.uid = theUIDS[i];
$http({ url: '/dropbox/accounts/get', method: 'GET', params: { uid: theUIDS[i] }}).success(function(acctData) {
temp.accountInfo = acctData;
});
$http({ url: '/dropbox/files/get', method: 'GET', params: { uid: theUIDS[i] }}).success(function(fileData) {
temp.files = fileData;
});
myDropbox.push(temp);
}
$scope.dropboxAccounts = myDropbox;
}
Ich überprüfen, ob es irgendwelche UID ' s und ich erstelle eine temp
- Objekt, welches gefüllt ist mit einem uid
, dann ein accountInfo
Objekt, und dann ein files
Objekt. Nachdem ich meine temp
Objekt, Schiebe ich es auf die myDropbox
array. Sobald die Schleife beendet ist, habe ich die dropboxAccounts Modell der myDropbox
variable in $scope
. Ich bin neu zu Eckig, aber ich bin mir ziemlich sicher, dies ist zumindest die richtige Idee. Zum Glück bin ich immer folgende Daten in der richtigen Reihenfolge:
{"uid":"332879"}
{"uid":"155478421",
"accountInfo":{
"country":"US",
"display_name":"Patrick Cason",
"name":"Second Dropbox",
"quota_normal":1174504,
"quota_shared":0,
"quota_total":2147483648,
"referral_link":"https://www.dropbox.com/referrals/NTE1NTQ3ODQyMTk?src=app9-203957",
"uid":155478421},
"files":[{
"created_at":"2013-04-17T15:13:46Z",
"directory":true,
"dropbox_user_id":26,
"fileType":"Folder",
"id":198,
"name":"Photos",
"path":"/Photos",
"rev":"10edb44f9",
"size":"-",
"updated_at":"2013-04-17T15:13:46Z"}]
}
Das merkwürdige ist, dass nur eine von meine UID ist wird aktualisiert. Ich weiß, dass die Schleife korrekt Durchlaufen, weil ich zwei UID ' s und wenn ich das alert am Anfang der Schleife, bekomme ich zwei Schleifen. Der Grund, warum ich denke, dass die zweite nicht aufgefüllt wird, weil die push-Anweisung, nicht zu warten, für die beiden verspricht, zu Durchlaufen. Wie kann ich sicherstellen, dass ich warten für jede AJAX-Aufrufe zu beenden, bevor die Zuweisung myDropbox
zu den $scope
variable?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einführung
Ich bin Recht neu in AngularJS, so ist diese Lösung sehr viel, so ein work-in-progress. Ich vermute, dass, da hab ich Sie kämpfte sich durch das lernen mehr darüber, dass Sie anderen Menschen in der gleichen position wie gut. Mit dieser sagte, ich werde nicht nur nach meiner Antwort, sondern auch erklären, mein Gedanke hinter dem code. Ich würde gerne ein feedback, wenn jemand fühlt sich die Antwort verbessert werden kann jeder.
Endgültige Code
Hier ist der code, den ich verwendet, um alles zu arbeiten:
Grundlegende Algorithmus
Beginnen wir mit der Deklaration eines Moduls
myApp
und speichern es in eine variableapp
... beachten Sie das leere array-wir vorbei, das wäre normalerweise ein parameter für alle weiteren Anforderungen, die können oder können nicht vererbt werden von anderen Modulen.Nachdem unser Modul deklariert ist, brauchen wir einen entsprechenden controller, der als gateway für alle Interaktionen stattfinden. In diesem Fall benötigen wir Zugriff auf die
$scope
Variablen, die im Vergleich zu unseren controller (nicht in Bezug auf die app selbst). Wir auch erklären, was dieses Werk controller verknüpft ist, in meinem Fall ist esdropbox
(wir bekommen, um Fabriken in einem moment). Innerhalb dieser controller vergeben wir zwei Modelle zu$scope
:dropboxAccounts
unddropboxFiles
. Beachten Sie, dass mein ursprünglicher Wunsch war es, ein Modell in meinem AngularJS app. Solange dies möglich ist... ich entschied mich dagegen, denn ich fand es schwer zu differenzieren, meine beiden Typen von JSON zurückgibt auseinander. Gibt Konto Metadaten und die andere gibt ein array von Dateien von diesem Konto. Ich hätte gerne all diese unter einem Modell und sortiert werden, durch eineuid
parameter, aber festgestellt, dass dies unmöglich zu tun, ohne zu verändern, was JSON meine RESTful-Endpunkte ausgegeben. Am Ende entschied ich mich für zwei separate Modelle, so kann ich mit Ihnen arbeiten zu erleichtern (bis ich einen Weg finden, Sie zu kombinieren, nach einem gemeinsamen parameter).Schließlich, wir erstellen eine Fabrik, die speichert meine AJAX-Funktionen (mit
$http
für die eigentliche AJAX-Aufrufs, und$q
für die Handhabung der verspricht). Ich habe zwei Funktionen: (denken Sie daran, die aufgerufen werden, von meinem controller)getAccounts
undgetFiles
. Jeder von Ihnen hat ein array mit dem Namen verspricht gespeichert wird, verspricht meiner$http
Anrufe. Ich Laufe durch diese ruft in einer for-Schleife, die sich bei jedem meiner Artikel intheUIDS
, die in meinem AJAX-Aufrufs, und ist dann darauf geschobenpromises
array. Am Ende haben wir unsere$q
die warten, bis alle AJAX-Aufrufe in derpromises
array erfolgreich abgeschlossen hat, vor der Rückgabe alle Daten in einem großen Versprechen zurück zu unserem controller und die Zuordnung zu$scope
.Was Ich Gelernt Habe,
AngularJS ist wirklich hart. Diese Frage hat mich zwei Tage zu Debuggen und zu versuchen, wieder und wieder. Mir wurde gesagt, dass, während die Lernkurve für diese front-end-MVC-framework ist ziemlich steil, die Belohnung ist es Wert. Ich nehme an, wir werden sehen...
Ressourcen
all
Methodefor (.. < theUIDs.length)...
können Sie die (IMO) mehr Ausdruckskraftangular.foreach(theUIDs, function(UID) {...})
Dies verhindert, dass das einfach zu machen, Fehler sehen Sie in der Implementierung, wo Sie vergessen, das 'var' vori
, und deklarieren eine neue variable mit globalem Gültigkeitsbereich: stackoverflow.com/questions/5717126/...