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!
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
.
@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
Tags und Links angularjs angular-ui-router