2015-07-15 15 views
6

Come sarebbe possibile ottenere il frammento di hash URL dai parametri di route in $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' 
}); 

Ricevere il frammento URL hash sarebbe facile utilizzando $locationChangeStart ma questo non è un'opzione per me.

+0

controllo questo fuori http://stackoverflow.com/questions/11541695/redirecting-to-a-certain-route-based-on-condition – stackg91

+1

Grazie. L'ho visto prima, ma non penso che sia d'aiuto per il mio particolare problema. – dasboe

risposta

5

dasboe: Penso di rispondere alla tua domanda.

Ho un'app con un controllo di autenticazione/autorizzazione nel gestore di eventi $ routeChangeStart. Se non autenticato, presento l'utente con la pagina di accesso modale. Voglio un login riuscito per inviarli alla loro destinazione originale (Beauty di $ routeChangeStart è che verrà eseguito nuovamente e controllerà l'autorizzazione dopo il login riuscito). Salvataggio del percorso creato dal successivo in un servizio di sessione utente immesso nel controller di accesso modale.

qui è il gestore di eventi

//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); 
        } 
       } 
      } 
     } 
    } 
}); 

Qui è la funzione che costruisce il percorso dal prossimo oggetto

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; 
} 

Note:

  • Io non sono appassionato sulla mia dipendenza da itinerario $$, ma non ho trovato nessun altro modo per farlo. Forse ho perso qualcosa di più facile. Potrei invitare problemi a lungo termine.
  • Il metodo preventDefault() non funziona sulle versioni di AngularJS precedenti alla 1.3.7 (vedere event.preventDefault() not working for routeChangeStart in angularjs app).
  • Avvertenza standard: questo è tutto il lato client e soggetto ad abuso. Assicurarsi che l'autenticazione/l'autorizzazione avvenga sul lato server.
  • Il successivo oggetto Route (dal gestore eventi) ha anche una proprietà params. Non sono sicuro se dovrei girare attraverso le sue proprietà come faccio con pathParams.
0

Se non si desidera utilizzare hasOwnProperty, si potrebbe approfittare del $$route.keys per ottenere i nomi dei nomi pathParams campi:

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

Non utilizzare campi oggetto con prefisso $$ come nelle risposte fornite in precedenza, poiché è un prefisso utilizzato da AngularJS per le proprietà private. Utilizzare questo metodo per ottenere l'URL da percorso (non testato):

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; 
}; 
Problemi correlati