2013-08-08 22 views
7

In un itinerari AngularJS il file v'è la possibilità di un percorso otherwise, la sostituzione di un 404:Percorsi angolari - reindirizzamento verso un sito esterno?

$routeProvider 
.when(...) 
.otherwise({ 
    redirectTo: 'my/path' 
}); 

C'è un modo per farlo in modo tale che l'altrimenti reindirizza a una pagina che non è in app? Ho provato

$routeProvider 
.when(...) 
.otherwise({ 
    redirectTo: 'http://example.com' 
}); 

ma questo sono finite cercato di reindirizzare a quel percorso nella mia app, che non esiste. La soluzione che conosco è di fare il reindirizzamento manuale in un $scope.$on('$routeChangeStart') in un controller di primo livello, ma si tratta di un sacco di duplicazione del codice (ed è brutto). C'è un modo migliore?

risposta

4

Al mio knowledge, questo non è possibile, poiché lo routeProvider gestisce solo percorsi interni.

Cosa si può fare se è

$routeProvider 
.when(...) 
.otherwise({ 
    controller: "404Controller", 
    template: "<div></div>" 
}); 

e poi basta usare window.location.href = 'http://yourExternalSite.com/404.html' nel controller.

2

Non mi consiglia di usare window.location.href nel nuovo controller come indicato in un'altra risposta, perché ngRoute avrebbe impostato la cronologia per puntare alla pagina inesistente (quindi quando l'utente fa clic indietro manterrà reindirizzamento alla pagina 404). Ho provato e non è riuscito.

vorrei puntare a mia soluzione correlata ad un altro SO domanda qui: https://stackoverflow.com/a/27938693/1863794

che ho adottato e applicato per lo scenario. Non penso che sia una brutta idea usare MainCtrl al di fuori della vista di ng dal momento che sarà dichiarata una sola volta a meno che non abbiate nidificati strati di ng-view ... Non vedo nemmeno duplicazioni di codice, è possibile inserire MainCtrl in un modulo separato se ti dà fastidio così tanto:

.config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
    .when(..) 
    .otherwise({redirectTo: 'http://yourExternalSite.com/404.html'}); 
}]) 
.controller('MainCtrl',[ // <- Use this controller outside of the ng-view! 
    '$rootScope','$window', 
    function($rootScope,$window){ 
    $rootScope.$on("$routeChangeStart", function (event, next, current) { 
     // next.$$route <-not set when routed through 'otherwise' since none $route were matched 
     if (next && !next.$$route) { 
     event.preventDefault(); // Stops the ngRoute to proceed with all the history state logic 
     // We have to do it async so that the route callback 
     // can be cleanly completed first, so $timeout works too 
     $rootScope.$evalAsync(function() { 
      // next.redirectTo would equal be 'http://yourExternalSite.com/404.html' 
      $window.location.href = next.redirectTo; 
     }); 
     } 
    }); 
    } 
]); 

Acclamazioni

4

nel mio caso, questo ha funzionato per me:

$routeProvider 
.when('/my-path', { 
    ...typical settings... 
}). 
.otherwise({ 
     redirectTo: function(obj, requestedPath) { 
      window.location.href = appConfig.url404; 
     } 
}); 
+0

Questa correzione ha funzionato per me (reindirizzamento alla risorsa non angolare sullo stesso host) –

Problemi correlati