2013-08-15 28 views
14

Chcę sprawdzić usługi http, aby zobaczyć, czy użytkownik jest uwierzytelniony i czy ma uprawnienia do wyświetlania określonej strony (kontrolera) w AngularJS 1.2.0rc1.Anuluj trasę i przekieruj do innej trasy bez wyświetlania oryginalnej treści w AngularJS

Mam taki scenariusz: Użytkownik A chce odwiedzić http://www.example.com/content. Teraz ta treść nie powinna być dostępna, gdy nie jest uwierzytelniona. Jeśli użytkownik nie jest uwierzytelniony, powinien zostać przekierowany na numer http://www.example.com/login.

Teraz udało mi się to zrobić, ale krótko widzę renderowany html strony z zawartością. Nie chcę tego. Jak mogę przekierować na stronę logowania, nie renderując strony z zawartością?

zarejestrować swoje trasy, takie jak:

$routeProvider.when('/login', route.resolve('Login', false)) 
$routeProvider.when('/content', route.resolve('Content', true)) 

Teraz mam wypróbowane to:

$rootScope.$on('$routeChangeStart', function (event, route) { 
    if (route.requiresLogin) { 
     $http.get('/api/user/loggedin/').then(function (response) { 
      if (response !== 'true') { 
       $location.path('/login'); 
      } 
     }); 
    } 
}); 

który pracuje, ale wciąż widzę zawartość HTML z drugiej strony (treść) miga.

Czytałem, że here że można także spróbować zmienić funkcjonalność resolve gdy trasa zostanie rozwiązany:

var resolve = function (baseName, requiresLogin) { 
    var routeDef = {}; 
    var dependencies = [routeConfig.getControllersDirectory() + baseName + 'Controller.js']; 

    routeDef.templateUrl = routeConfig.getViewsDirectory() + baseName.toLowerCase() + '.html'; 
    routeDef.controller = baseName + 'Controller'; 
    routeDef.requiresLogin = requiresLogin; 
    routeDef.resolve = { 
     load: ['$q', '$rootScope', '$http', '$location', function ($q, $rootScope, $http, $location) { 
      console.log(requiresLogin); 
      if (requiresLogin) { 
       return checkLoggedIn($q, $rootScope, $http, $location); 
      } else { 
       return resolveDependencies($q, $rootScope, dependencies); 
      } 
     }] 
    }; 

    return routeDef; 
} 

Ale tu strona jest wyświetlana także na krótko.

Mam nadzieję, że możesz mi pomóc.

Odpowiedz

21

Pierwsza odpowiedź powinna działać, ale aby to zrobić za pomocą $q użyłbym defer.resolve() lub defer.reject("rejection_reason") następnie chciałbym słuchać na $routeChangeError w kontroler najwyższego poziomu, który jest związany z elementem poza NG-pogląd, że routeProvider zarządza.

Więc w HTML, coś jak:

<body ng-app="app" ng-controller="DocumentCtrl"> 
    <div ng-view> 
    </div> 
</body> 

Wtedy że droga twoja byłoby zdefiniowane coś takiego:

when('/home', { 
    templateUrl: templateUrl blah, 
    controller: baseName + 'Controller', 
    resolve: { 
    load: function($q, MY_USER_SERVICE){ 
     var defer = $q.defer(); 
     if(~MY USER LOGGED_IN LOGIC RETURNS TRUE~){ 
     defer.resolve(); 
     } else { 
     defer.reject("not_logged_in"); 
     } 
     return defer.promise; 

    } 
    } 
}). 

Wtedy mój kontroler DocumentCtrl będzie zawierać:

$scope.$on("$routeChangeError", function(evt,current,previous,rejection){ 
    if(rejection == "not_logged_in"){ 
    //DO SOMETHING 
    } else { 
    //OR DO SOMETHING ELSE 
    } 
}); 

Używam powyższych i nie ma flash żadnych widoków, które nie powinny być ładowane.

+0

Potwierdzono jako sposób radzenia sobie z tym, nie wyświetlając oryginalnej strony przekierowanej. Obietnice nie są konieczne, prosty rzut nowy błąd ("") jest wystarczający. Kluczem jest to, że tylko błąd zatrzyma bieżącą nawigację. Maybey, przyszła wersja Angulara, przyniesie nam porządny sposób radzenia sobie z warunkowym (wstrzykniętym) przekierowaniem. – Remco

+0

Och, interesujące. Se możemy po prostu zwrócić wartość true w funkcji ładowania, lub warunkowo podać błąd powyżej, jeśli nie chcemy pozwolić na dostęp? W każdym z przykładów widziałem obietnice. – Ade

+0

Korzystanie z UI-routera sprawiło, że wszystko to stało się łatwe. Po prostu wpisanie '$ state.go ('state')' wewnątrz 'resolve' przekierowuje cię przed załadowaniem kontrolera. – Meliodas

Powiązane problemy