$ HTTP-Antwort im Dienst verarbeiten
Ich vor kurzem veröffentlicht eine ausführliche Beschreibung des Problems ich bin vor hier an SO. So konnte ich nicht senden Sie eine tatsächliche $http
Anfrage, die ich verwendet, timeout asynchrones Verhalten zu simulieren. Datenbindung von meinem Modell anzeigen korrekt funktioniert, mit Hilfe von @Gloopy
Nun, wenn ich $http
statt $timeout
(lokal getestet), ich konnte sehen, wie die asynchrone Anforderung erfolgreich war und der data
ist gefüllt mit json-Antwort in meinem Dienst. Aber, meine Ansicht wird nicht aktualisiert.
aktualisiert Plunkr hier
InformationsquelleAutor der Frage bsr | 2012-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Zupfen das tut, was Sie wollen: http://plnkr.co/edit/TTlbSv?p=preview
Die Idee ist, dass Sie Ihre Arbeit mit dem Versprechen, direkt und Ihre "dann" - Funktionen zu manipulieren und Zugriff auf die asynchron zurückgegebenen Antworten.
Hier ist eine etwas kompliziertere version, die caches die Anfrage, so dass Sie nur machen es zum ersten mal (http://plnkr.co/edit/2yH1F4IMZlMS8QsV9rHv?p=preview):
InformationsquelleAutor der Antwort Pete BD
Lass es einfach sein. Es ist so einfach wie
promise
im Dienst(keine Notwendigkeit zu verwendenthen
im Dienst)then
im controllerDemo. http://plnkr.co/edit/cbdG5p?p=preview
InformationsquelleAutor der Antwort allenhwkim
Weil es asynchron ist, wird die
$scope
immer die Daten vor dem ajax-Aufruf abgeschlossen ist.Könnten Sie
$q
in Ihrem Dienst zu erstellenpromise
und geben es zurück ancontroller, und controller erhalten Sie das Ergebnis innerhalb von
then()
Aufruf gegenpromise
.In Ihren Dienst,
Dann, in Ihrem controller:
InformationsquelleAutor der Antwort Tosh
tosh shimayama haben eine Lösung, aber man kann vereinfacht eine Menge, wenn Sie die Tatsache, dass der $http-zurück-Versprechen und Versprechen kann einen Wert zurückgeben:
Eine kleine demonstration in coffeescript: http://plunker.no.de/edit/ksnErx?live=preview
Ihre plunker aktualisiert, mit meiner Methode: http://plnkr.co/edit/mwSZGK?p=preview
InformationsquelleAutor der Antwort Guillaume86
Einen viel besseren Weg, denke ich, wäre so etwas wie dieses:
Service:
Und in dem controller können Sie einfach verwenden:
Winkel wird automatisch die gelöst
awesomeFruits
in die$scope.fruits
.InformationsquelleAutor der Antwort HasanAboShally
Ich hatte das gleiche problem, aber wenn ich war surfen auf das internet, habe ich verstanden, dass $http und zurück durch einen Standard Versprechen, dann könnte ich es mit "dann" nach der Rückkehr der "Daten". Blick in den code:
InformationsquelleAutor der Antwort JhonQO
Beim binden der UI in array werden Sie wollen, stellen Sie sicher, aktualisieren Sie das gleiche array direkt, indem Sie die Länge auf 0 und drücken der Daten in das array.
Statt (was eine andere array-Referenz zu
data
die Ihre UI nicht kennen):versuchen Sie dies:
Hier ist ein Turnschuh , dass zeigt den Unterschied zwischen der Einstellung eines neuen array-vs Entleerung und hinzufügen zu einem bestehenden ein. Ich konnte Sie nicht bekommen Ihr plnkr arbeiten doch hoffentlich für Sie arbeitet!
InformationsquelleAutor der Antwort Gloopy
Im Zusammenhang mit diesem ging ich durch ein ähnliches problem, aber nicht mit get oder post gemacht, durch die Eckige, sondern mit einer Erweiterung durch eine 3. Partei (in meinem Fall Google Chrome-Erweiterung).
Das problem, das ich konfrontiert ist, dass der Chrome-Erweiterung nicht zurück
then()
also ich war nicht in der Lage, es zu tun die Art und Weise, in der Lösung oben, aber das Ergebnis ist immer noch Asynchron.Also meine Lösung ist, einen Dienst zu erstellen und zu gehen, um eine callback -
Dann in meinen controller
Hoffe, dass dies anderen helfen kann, immer das gleiche Problem.
InformationsquelleAutor der Antwort Shadowbob
Habe ich gelesen http://markdalgleish.com/2013/06/using-promises-in-angularjs-views/
[AngularJS ermöglicht uns die Optimierung unseres controller-Logik, indem Sie ein Versprechen, die direkt auf den Rahmen, anstatt manuell die übergabe der aufgelösten Wert in einem Erfolgs-callback.]
so einfach und praktisch 🙂
Hoffe, dass dies helfen
InformationsquelleAutor der Antwort Whisher
Ich weiß wirklich nicht, wie die Tatsache, dass, weil der "Versprechen" Weg, Dinge zu tun, die Verbraucher der service, der verwendet den $http-muss "wissen" darüber, wie packen Sie die Antwort.
Ich wollen einfach nur zu rufen, etwas, und bekomme die Daten, ähnlich wie der alte
$scope.items = Data.getData();
Art und Weise, die jetzt veraltet.Ich habe versucht, für eine Weile und hat nicht eine perfekte Lösung, aber hier ist meine best-shot - ( Plunker ). Es kann nützlich sein, um jemanden.
Dann controller:
Fehler, die ich bereits Punkt sind
getData
kann nur akzeptieren, dieobj
parameter in form eines Objekts (obwohl es sein könnte, akzeptieren auch ein array), die nicht ein problem für viele Anwendungen, aber es ist ein Wunder Einschränkung$scope.data
mit= {}
zu machen, ein Objekt (im Grunde das, was$scope.clearData()
macht vor), oder= []
für ein array, oder es wird nicht funktionieren (sind wir jetzt schon zu übernehmen, etwas darüber, was die Daten kommen). Ich habe versucht, das zu tun diese Vorbereitung Schritt INgetData
aber kein Glück.Dennoch, es bietet ein Muster, das entfernt-controller "promise " Ausgliedern" boilerplate, und könnte nützlich sein, in Fällen, wenn Sie wollen, um bestimmte Daten aus der $http in mehr als einem Ort, während Sie es TROCKEN.
InformationsquelleAutor der Antwort poshest
Soweit Zwischenspeicherung der Antwort in Hinblick auf den service , hier ist eine andere version, die scheint mehr geradlinig als das, was ich bisher gesehen habe:
dieser Dienst zurückkehren wird entweder die Cache-Daten oder
$http.get
;InformationsquelleAutor der Antwort maioman