Der angulare UI-Router wird zweimal aufgerufen

8

Das hat mich in den letzten paar Stunden verrückt gemacht und ich kann immer noch keine Lösung finden ...

Grundsätzlich ändere ich den Status in 404 , wenn eine Auflösung einen http 404 Statuscode zurückgibt. Ich ändere den Status in $stateChangeError event. Es funktioniert alles gut, außer, nachdem der Status zu 404 geändert wurde, startet er einen anderen Zustandswechsel zurück zum ursprünglichen und löst somit zweimal auf. Der Status selbst bleibt auf 404 , funktioniert also, macht aber immer noch zusätzliche $http -Anfragen, die nicht benötigt werden. Es funktioniert jedoch nur so, wenn ich $state.go('404', null, { location: false }) ODER verwende, wenn im Status 404 überhaupt keine URL definiert ist.

Wenn ich eine URL für den 404 -Zustand ( /404 ) definiert habe, funktioniert alles gut.

Hier sind 2 Stifte, die das Problem demonstrieren:

Der Fehler: Ссылка (Debug-Modus, Kontrollkonsole: Ссылка )

Der funktionierende: Ссылка (Debug-Modus, Kontrollkonsole: Ссылка )

Irgendeine Idee, wie Sie dieses Problem beheben können? Ich habe wirklich keine Ideen mehr.

Danke!

    
Andrew 03.05.2016, 17:14
quelle

2 Antworten

4

Für mich haben Sie bereits die Lösung gefunden. In der Tat, wie in Ihrem Code angegeben:

%Vor%

Die Standard-URL ist /profile/x/details . Wenn die ui-router sieht Diese URL wird versuchen, die Statushierarchie zu laden: base , base.profile et base.profile.details . Wie Sie gesagt haben, wird der letzte nicht geladen, da Sie einen 404-Fehler bekommen und die Anfrage anderswo umleiten.

Das Problem ist, dass Sie sich immer noch in /profile/x/details befinden. Also, in stateChangeError , wenn Sie $state.go('404', null, { location: false }); gemacht haben, wird ui-router nach der URL suchen.

Da es nicht in 404 eingestellt ist, nimmt er das, das er hat: /profile/x/details . Und deshalb löst er die gleiche Statushierarchie auf: base , base.profile et base.profile.details .

    
Zakaria 06.05.2016 19:44
quelle
4

@Andrew Ich schätze, ich bin mir nicht sicher, was genau deine Ziele sind, aber es scheint, als würdest du gegen die Art und Weise kämpfen, wie der UI-Router funktioniert.

@Zakaria macht einen guten Job und fasst die Probleme zusammen.

Vielleicht machen Sie einen Schritt zurück und sehen Sie, ob es wirklich sinnvoll ist, einen Benutzer auf einer toten oder teilweise toten Seite zu belassen. Wenn Sie versuchen, eine fehlgeschlagene Lösung zu verarbeiten, fangen Sie möglicherweise die 404-Anforderung (oder die fehlgeschlagene Anforderung) ab und geben eine Standardauflösung zurück, anstatt in einen neuen Fehlerzustand zu wechseln. Wenn Sie Ihre when -Anweisung bei $urlRouterProvider.when('/', '/profile/x/details'); behalten, werden Sie nur Probleme bekommen, wie sie derzeit entworfen wird

    
BatteryAcid 06.05.2016 21:20
quelle

Tags und Links