Das Verzögern der AngularJS-Route ändert sich, bis das Modell geladen ist, um ein Flimmern zu verhindern
Frage ich mich, ob es eine Möglichkeit gibt (ähnlich Gmail) für AngularJS zu verzögern, zeigt eine neue route, bis nach jedem Modell und seine Daten abgerufen wurde über Ihre jeweiligen Dienstleistungen.
Zum Beispiel, wenn es eine ProjectsController
aufgeführt sind alle Projekte und project_index.html
das war die Vorlage, die zeigte, dass diese Projekte Project.query()
würde geholt werden vollständig, bevor Sie mit der neuen Seite.
Bis dahin die alte Seite weiterhin zu zeigen (zum Beispiel, wenn ich im Internet surfen wurden anderen Seite, und dann beschlossen, das Projekt index).
InformationsquelleAutor der Frage Misko Hevery | 2012-08-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
$routeProvider beheben Eigenschaft ermöglicht die Verzögerung der route ändern, bis die Daten geladen sind.
Definieren Sie zuerst eine route mit
resolve
- Attribut wie dieses.beachten Sie, dass die
resolve
Eigenschaft definiert ist, auf der Strecke.Beachten Sie, dass die controller-definition enthält eine Behebung Objekt, welches erklärt Dinge, die sollte vorhanden sein, um dem controller-Konstruktor. Hier die
phones
eingespritzt wird, in der Steuerung und es wird definiert, in dieresolve
Eigenschaft.Den
resolve.phones
Funktion ist verantwortlich für die Rückkehr ein Versprechen. All die Versprechen, die erhoben werden, und die route ändern wird verzögert, bis nach all den Versprechungen aufgelöst werden.Arbeiten demo: http://mhevery.github.com/angular-phonecat/app/#/phones
Quelle: https://github.com/mhevery/angular-phonecat/commit/ba33d3ec2d01b70eb5d3d531619bf90153496831
InformationsquelleAutor der Antwort Misko Hevery
Hier ein minimal Beispiel arbeiten die Werke für Eckige 1.0.2
Vorlage:
JavaScript:
http://jsfiddle.net/dTJ9N/3/
Abgespeckte version:
Da $http() gibt bereits ein Versprechen (auch aufgeschoben), die wir eigentlich nicht brauchen, um unsere eigene erzeugen. So können wir vereinfachen MyCtrl. beheben:
Das Ergebnis von $http() enthält Daten, status, Header und config Objekte, so müssen wir verändern den Körper von MyCtrl:
http://jsfiddle.net/dTJ9N/5/
InformationsquelleAutor der Antwort
Sehe ich einige Leute gefragt, wie es mit dem Winkel.controller-Methode mit Verkleinerung freundlich dependency injection. Da ich gerade diese arbeiten, fühlte ich mich verpflichtet, wieder zu kommen und zu helfen. Hier ist meine Lösung (übernommen aus der ursprünglichen Frage und Misko ' s Antwort):
Da dieser code leitet sich aus der Frage/beliebteste Antwort es ist ungetestet, aber es sollte schicken Sie in die richtige Richtung, wenn Sie bereits wissen, wie zu machen minifizierung freundlich eckig-code. Der eine Teil, dass meinen eigenen code nicht benötigt wurde eine Injektion von "Phone" in der resolve-Funktion für 'Telefone', noch habe ich ein 'delay' - Objekt überhaupt.
Ich auch empfehlen, das youtube-video http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp , was mir half, einiges
Sollte es Sie interessieren, habe ich beschlossen, das auch einfügen, meinem eigenen code (Geschrieben in coffeescript), so dass Sie sehen können, wie ich es geschafft habe.
FYI, im Voraus ich benutze einen generischen controller, der hilft mir CRUD auf mehrere Modelle:
InformationsquelleAutor der Antwort bitwit
Diese verpflichten, das ist Bestandteil der version 1.1.5 und höher, macht die
$promise
Objekt$resource
. Versionen von ngResource darunter das Begehen erlauben auflösen von Ressourcen wie diese:$routeProvider
controller
InformationsquelleAutor der Antwort Max is hiring Elm and JS devs
Diesem snippet ist dependency injection freundlich (ich selbst nutze es in Kombination ngmin und verunstalten) und es ist eine mehr elegante domain-driven - basierte Lösung.
Beispiel unten wird ein Telefon Ressource und ein Konstante phoneRoutes, die enthält alle Ihre routing-Informationen für die (Telefon -) Domäne. Etwas, das ich nicht wie in der mitgelieferten Antwort war die Lage des beheben Logik -- die main Modul sollte nicht wissen alles oder belästigt werden, über die Art der Ressource, die Argumente an den controller. Auf diese Weise die Logik bleibt in der gleichen Domäne.
Hinweis: wenn Sie ngmin (und wenn Sie nicht: Sie sollten) Sie nur schreiben müssen das auflösen von Funktionen mit DI-array-Konvention.
Das nächste Stück ist die Injektion der routing-Daten, wenn das Modul in der Konfiguration Stand und Ihre Anwendung auf die $routeProvider.
Testen der route-Konfiguration mit diesem setup ist auch Recht einfach:
Können Sie es in vollem Ruhm in meine aktuelle (kommende) experiment.
Obwohl diese Methode funktioniert gut für mich, ich Frage mich wirklich, warum die $Injektor ist nicht verzögern Bau von alles, wenn es erkennt Injektion von alles das ist ein Versprechen Objekt; es würde die Dinge soooOOOOOooOOOOO viel einfacher.
Edit: verwendet Eckige v1.2(rc2)
InformationsquelleAutor der Antwort null
Verzögerung zeigen, die route sicher ist, führt zu einer asynchronen Gewirr... warum nicht einfach die Spur laden status Ihrer Haupt-Einheit und verwenden Sie, dass in der Ansicht. Zum Beispiel in Ihrem controller, den Sie verwenden könnten sowohl die Erfolgs-und Fehler-callbacks auf ngResource:
Dann in der Ansicht, Sie könnten tun, was auch immer:
InformationsquelleAutor der Antwort jpsimons
Arbeitete ich von Misko ' s code von oben und das ist, was ich getan habe. Dies ist eine aktuelle Lösung, da
$defer
wurde geändert, um$timeout
. Ersetzen$timeout
jedoch warten, für den timeout-Zeitraum (in Misko ' s code, 1 Sekunde), dann wieder die Daten in der Hoffnung es in der Zeit gelöst. Mit dieser Art, es gibt so bald wie möglich.InformationsquelleAutor der Antwort Justen
Mit AngularJS 1.1.5
Aktualisierung der 'Telefone' Funktion in Justen Antwort mit AngularJS 1.1.5 syntax.
Original:
Aktualisiert:
Viel kürzer, Dank der Winkel-team und die Mitwirkenden. 🙂
Dies ist auch die Antwort von Maximilian Hoffmann. Anscheinend Begehen Sie in 1.1.5.
InformationsquelleAutor der Antwort OJ Raqueño
Können Sie $routeProvider beheben Eigentum zu verzögern, route ändern, bis die Daten geladen sind.
Beachten Sie, dass die
resolve
Eigenschaft definiert ist, auf der Strecke.EntitiesCtrlResolve
undEntityCtrlResolve
ist Konstante definierten Objekte in der gleichen Datei wieEntitiesCtrl
undEntityCtrl
Controller.InformationsquelleAutor der Antwort Bohdan Lyzanets
Ich mag darkporter Idee, weil es leicht sein wird für ein dev-team neu zu AngularJS zu verstehen und funktionierte sofort.
Habe ich diese Anpassung, die verwendet 2 divs, eines für die loader-bar und ein weiteres für die eigentlichen Inhalte angezeigt, nachdem die Daten geladen. Fehlerbehandlung gemacht werden würde anderswo.
Fügen Sie eine "ready" - flag auf $scope:
In der html-Ansicht:
Siehe auch: Boostrap Fortschrittsbalken docs
InformationsquelleAutor der Antwort reggoodwin
Mochte ich über Antworten und lernte viel von Ihnen, aber es ist etwas, das fehlt in den meisten der oben genannten Antworten.
Ich steckte in einer ähnlichen Szenario, in dem ich war resolving-url mit einigen Daten, die abgerufen wird, in die erste Anforderung von dem server. Problem, das ich konfrontiert war, was ist, wenn das Versprechen ist
rejected
.War ich mit einem custom-Anbieter, die zurück
Promise
wurde gelöst, indem dieresolve
von$routeProvider
zum Zeitpunkt der config-phase.Was ich hier betonen möchte ist das Konzept der
when
es nicht so etwas wie dieses.Sieht es die url in der url-Leiste und dann die jeweiligen
when
block genannt, controller und view bezeichnet wird, so weit so gut.Können sagen, ich habe folgende config-phase-code.
Root-url im browser ersten block ausführen aufgerufen werden, sonst
otherwise
aufgerufen wird.Let ' s stellen Sie sich ein Szenario, das ich hit rootUrl in der Adresszeile
AuthServicePrivider.auth()
Funktion aufgerufen wird.Sagen wir Versprechen zurückgegeben wird, in ablehnen Zustand was dann???
Nichts gerendert wird überhaupt.
Otherwise
- block wird nicht ausgeführt, da es für jede url, die nicht definiert in der config-block und unbekannt ist angularJs config-phase.Müssen wir behandeln den Fall, dass gefeuert wird, wenn dieses Versprechen nicht aufgelöst. Bei Ausfall
$routeChangeErorr
gefeuert wird auf$rootScope
.Es kann erfasst werden, wie gezeigt, im code unten.
IMO ist Es generell eine gute Idee, um Ereignis-tracking-code in der run-block-Anwendung. Dieser code ausgeführt, kurz nach der config-phase der Anwendung.
Diese Weise bewältigen wir Versprechen scheitern bei der config-phase.
InformationsquelleAutor der Antwort Ashish Singh
Ich habe eine komplexe multi-level-Schiebe-panel-Schnittstelle, die mit Behinderten Bildschirm Schicht. Die Erstellung der Richtlinie zum deaktivieren des Bildschirm-Schicht, erstellen, klicken Sie auf Ereignis zum ausführen der Staat wie
wurden produziert einen flimmernden Effekt. Geschichte.zurück (), statt es funktionierte ok, aber seine nicht immer zurück in die Geschichte, in meinem Fall. ALSO, was ich herausgefunden habe ist, dass wenn ich Sie einfach erstellen Attribut href auf meinem Bildschirm deaktivieren anstelle des Staates.gehen , arbeitete wie ein Charme.
Richtlinie 'zurück'
app.js ich Speichere nur den vorherigen Zustand
InformationsquelleAutor der Antwort Dima
Eine mögliche Lösung könnte die Verwendung der ng-cloak-Richtlinie mit dem element, wo wir mithilfe der Modelle z.B.
Ich denke, das braucht am wenigsten Aufwand.
InformationsquelleAutor der Antwort Devendra Singh