$ http.post to błąd. Jak dotąd najlepszą odpowiedzią jest @ Kliment's. Interceptory to najlepszy sposób zarządzania treścią przed i po żądaniach HTTP.
Jednakże, jeśli końcowy celem jest, aby uniemożliwić dostęp do strony, trzeba przynajmniej użyć wtyczki routingu (ngRoute, ui-router) ze względu na pomysł obietnicy zawsze będzie opóźnienie między żądanie HTTP i odpowiedź.
W zależności od czasu reakcji serwera, strona będzie wyświetlana przez około sekundę.
Z routerem ui po prostu skonfiguruj metodę resolve dla każdego stanu, który chcesz chronić. To może wyglądać następująco:
.state('protected',
{
url : '/protected_page',
templateUrl : 'secret.html',
resolve: {
loggedin: loggedin
}
})
loggedin odnosi się do funkcji można zdefiniować, który zawiera $ wezwanie http.post (lub jeszcze lepiej usługa)
function loggedin($timeout, $q, $location, loginService) {
loginService.then(function(data) {
if(data.status == 401) {
//$timeout(function() { $location.path('/login'); });
return $q.reject();
} else {
return $q.when();
}
});
}
Tutaj ta konkretna usługa zwraca Status 401, ale możesz zwrócić wszystko.
Stan nie zostanie rozwiązany (a strona nie zostanie wyświetlona), dopóki nie zostanie zaakceptowana lub odrzucona.
Możesz przekierować bezpośrednio stamtąd, jeśli chcesz, chociaż nie jest to zbyt eleganckie. ui-Router daje inną opcję z domyślnej przekierowanie:
if (tokenIsValid())
$urlRouterProvider.otherwise("/home");
else
$urlRouterProvider.otherwise("/login");
Z inaczej powiedzieć UI-router, aby przejść do niektórych adresów URL, jeśli nie istnieje państwo dla danego wniosku lub jeżeli postanowienie zostało odrzucone.
Na inny temat, twój http request jest źle napisany.
.success i .error są przestarzałe i nie trzeba stworzyć obietnicę ($ q) nad żądania $ http że sama już wraca obietnicę.
Masz dobry przykład w dokumentacji powiązanej powyżej.
Strona lub trasa? Jeśli jest to strona, działa tylko przekierowanie javascript. – Ronnie
@Ronnie do strony. –
Myślę, że pytanie jest rodzajem duplikatu http://stackoverflow.com/questions/11541695/redirecting-to-a-certain-route-based-on-condition. Powinieneś użyć usługi '' $ location'' https://docs.angularjs.org/api/ng/service/$location. To jest '' $ location.path ('/ login'); '' na przykład. – tiblu