2014-02-19 10 views
18

Ich benutze Angular Ui-Router und habe eine Auflösungsfunktion für einen meiner Zustände eingerichtet, bevor der Controller initialisiert wird. Ich erhalte einige Daten, durchlaufe sie und passe sie der URL stateParam an, und wenn eine Übereinstimmung gefunden wird, löse das Versprechen an den Controller und gebe das Objekt in der Zusage zurück. Das funktioniert alles gut.

Wenn jedoch keine Übereinstimmung gefunden wird, ich will einfach in einen anderen Zustand umgeleitet werden durch das Versprechen, die Ablehnung und Lauf $state.go('state');

Ganz einfach:

deferred.reject(); 
$state.go('state',{params: 'param'}); 

Aber dies scheint nicht zu mach alles. Der Controller hängt einfach, und ich bekomme keine Konsolenfehler oder irgendetwas. Irgendwelche Ideen?

+0

Können Sie mehr Code bereitstellen? Liegt das in einer '$ Digest'-Schleife? – rtcherry

+0

Entschuldigung, jetzt klarer zu sein ... das ist in meiner App-Konfiguration für $ stateProvider, es ist in einer Entschlossenheit für einen meiner Zustände. –

Antwort

31

ui-Router soll eine $stateChangeError werfen, wenn eine Route Entschlossenheit zurückgewiesen. Sie müssen auf dieses Ereignis achten und dort Ihren Statusübergang auslösen.

Gemäß dem wiki:

$stateChangeError - ausgelöst, wenn ein Fehler beim Übergang auftritt. Es ist wichtig zu beachten, dass wenn Sie Fehler in Ihren Auflösungsfunktionen haben (JavaScript-Fehler, nicht existierende Dienste, usw.), sie nicht traditionell geworfen werden. Sie müssen auf dieses $ stateChangeError-Ereignis warten, um ALLE Fehler abzufangen.

https://github.com/angular-ui/ui-router/wiki#wiki-state-change-events


Wie @gustavohenke in den Kommentaren erwähnt, ein guter Ort, diese Prozedur zu setzen ist die primäre .run() Funktion Ihrer Anwendung.

+0

Danke. Darf nicht darüber nachdenken. –

+1

Ich habe versucht, selbst auf das $ stateChangeError-Ereignis zu hören, und sehe nie, dass es ausgelöst wird, selbst wenn ich weiß, dass $ q.reject aufgerufen wurde. Dadurch bleibt die App im vorherigen Zustand, ohne Benachrichtigung oder im Falle einer ersten Ladung in einem unbekannten Status. – weierophinney

+1

Sie müssen sicherstellen, dass Sie '$ stateChangeError' in einem Controller handhaben, der geladen wurde (z. B. höher in der Hierarchie als Ihr Auflösungsaufruf). Wenn Sie den Root-Status abfangen müssen, verwenden Sie einen 'ng-Controller' in Ihrem html- oder body-Tag als einen immer geladenen Controller. –

-3

Sie missverstehen, wie Versprechen funktionieren. deferred.reject() benachrichtigt einfach die deferred.promise, dass es abgelehnt wurde.

var promise = deferred.promise; 

promise.then(
    function (result) { 
    // this function runs if the promise was resolved 
    }, 
    function (result) { 
    // this function runs if the promise was rejected 
    // this is where you should put $state.go(..) 
    } 
) 
+1

Er fragt, wie man mit der Ablehnung umgehen soll, er weiß genau, was die Verheißung ablehnt! – cheziHoyzer

Verwandte Themen