2015-07-15 17 views
6

Jak można uzyskać fragment hasłowy URL z parametrów trasy w $routeChangeStart.

$scope.$on('$routeChangeStart', function (event, next, current) { 
    // trying to get the url hash fragment from <next> param here 
    // e.g. to_url_function(next) -> '/my_path/1' 
}); 

Otrzymanie URL hash fragment będzie łatwe przy użyciu $locationChangeStart ale nie jest to opcja dla mnie.

+0

zajrzyj na http://stackoverflow.com/questions/11541695/redirecting-to-a-certain-route-based-on-condition – stackg91

+1

Dzięki. Widziałem to już wcześniej, ale nie sądzę, że pomoże to w moim konkretnym problemie. – dasboe

Odpowiedz

5

dasboe: Myślę, że odpowiadam na twoje pytanie.

Mam aplikację z sprawdzaniem autentyczności/autoryzacji w module obsługi zdarzeń $ routeChangeStart. Jeśli nie zostanie uwierzytelniony, przedstawiam użytkownikowi stronę logowania modalnego. Chcę udanego logowania, aby wysłać je do ich pierwotnego miejsca docelowego (Beauty of $ routeChangeStart oznacza, że ​​uruchomi się ponownie i sprawdzi autoryzację po pomyślnym zalogowaniu). Zapisuję ścieżkę zbudowaną od następnej w usłudze sesji użytkownika, która jest wstrzykiwana do modalnego kontrolera logowania.

oto obsługi zdarzeń

//before each route change, check if the user is logged in 
//and authorized to move onto the next route 
$rootScope.$on('$routeChangeStart', function (event, next, prev) { 
    if (next !== undefined) { 
     if ('data' in next) { 
      if ('authorizedRoles' in next.data) { 
       var authorizedRoles = next.data.authorizedRoles; 
       if (!SessionService.isAuthorized(authorizedRoles)) { 
        event.preventDefault(); 
        SessionService.setRedirectOnLogin(BuildPathFromRoute(next)); 
        if (SessionService.isLoggedIn()) { 
         // user is not allowed 
         $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); 
        } else { 
         // user is not logged in 
         $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated); 
        } 
       } 
      } 
     } 
    } 
}); 

Oto funkcja, która buduje ścieżkę od następnego obiektu

function BuildPathFromRoute(routeObj) 
{ 
    var path = routeObj.$$route.originalPath; 
    for (var property in routeObj.pathParams) 
    { 
     if (routeObj.pathParams.hasOwnProperty(property)) 
     { 
      var regEx = new RegExp(":" + property, "gi"); 
      path = path.replace(regEx, routeObj.pathParams[property].toString()); 
     } 
    } 
    return path; 
} 

Uwagi:

  • Nie jestem zapalonym na moim zaufaniu na trasie $$, ale nie mogłem znaleźć innego sposobu na to. Może tęskniłem za czymś łatwiejszym. Mogę zapraszać kłopoty na dłuższą metę.
  • Funkcja preventDefault() nie będzie działać w wersjach AngularJS przed wersją 1.3.7 (patrz event.preventDefault() not working for routeChangeStart in angularjs app).
  • Standardowe zastrzeżenie: jest to strona klienta i może być przedmiotem nadużycia. Upewnij się, że uwierzytelnienie/autoryzacja ma miejsce po stronie serwera.
  • Następny obiekt trasy (z obsługi zdarzeń) ma również właściwość params. Nie jestem pewien, czy powinienem przerzucać jego właściwości, tak jak robię pathParams.
0

Jeśli nie chcesz używać hasOwnProperty, można skorzystać z $$route.keys dostać nazwiska nazwisk pathParams dziedzinach:

function getPathFromRoute(routeObj) 
{ 
    var path = routeObj.$$route.originalPath; 
    var keys = routeObj.$$route.keys; 
    var value;  
    for (var i = 0; i < keys.length; i++) { 
     if(angular.isDefined(keys[i]) && angular.isDefined(keys[i].name)){ 
      value = routeObj.pathParams[keys[i].name]; 
      var regEx = new RegExp(":" + keys[i].name, "gi"); 
      path = path.replace(regEx, value.toString());    
     } 
    }  
    return path; 
}; 
0

Nie używać pól obiektu z prefiksem $$ podobnie jak w wcześniej podanych odpowiedziach, ponieważ jest to prefiks używany przez AngularJS dla prywatnych właściwości. Użyj tej metody Get URL z trasy (nie testowane):

var buildPathFromRoute = function (route) { 
    // get original route path 
    var path = route.originalPath; 
    // get params keys 
    var keysLength = route.keys.length; 
    for (var i=0; i<keysLength; i+=1) { 
     var param = route.keys[i]; 

     // optional params postfix is '?' 
     var postfix = param.optional ? '\\?' : ''; 

     var replaceString = ':' + param.name + postfix; 
     var regex = new RegExp(replaceString, 'g'); 
     var paramValue = route.params[param.name].toString(); 

     // replace param with value 
     path = path.replace(regex, paramValue); 
    } 

    path = path.replace(/\:\S+?\??/g, ''); 
    return path; 
};