2013-08-08 3 views
7

В одном AngularJS маршрутах файл есть возможность для otherwise маршрута, заменяя 404:Угловые маршруты - перенаправление на внешний сайт?

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

Есть ли способ сделать это таким образом, что в противном случае перенаправляет на страницу, которая не в приложении? Я пробовал

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

но этот jsut попытался перенаправить на этот путь в моем приложении, которого не существует. Решение, которое я знаю, состоит в том, чтобы выполнить ручное перенаправление в $scope.$on('$routeChangeStart') в контроллере верхнего уровня, но это много дублирования кода (и это уродливо). Есть ли способ лучше?

ответ

4

К моим knowledge, это невозможно, так как routeProvider обрабатывает только внутренние маршруты.

Что вы можете сделать, хотя это

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

, а затем просто использовать window.location.href = 'http://yourExternalSite.com/404.html' в контроллере.

2

Я не буду рекомендовать, просто используя window.location.href в новом контроллере, как указано в другом ответе, потому что ngRoute установил бы историю, указывающую на несуществующую страницу (поэтому, когда пользователь нажимает на нее, она будет продолжать перенаправление на страницу 404). Я пробовал, и это провалилось.

Я хотел бы указать вам на мое решение связанным с другим SO вопросом здесь: https://stackoverflow.com/a/27938693/1863794

я принял, что и применительно к вашему сценарию. Я не думаю, что это плохой идеей использовать MainCtrl вне ng-view, так как он будет объявлен только один раз, если у вас нет вложенных слоев ng-view ... Я тоже не вижу дублирования кода, вы можете разместить MainCtrl в отдельном модуле, если это беспокоит вас так много:

.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; 
     }); 
     } 
    }); 
    } 
]); 

Приветствия

4

в моем случае, это работает для меня:

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

Это исправление работало для меня (перенаправление без углового ресурса на одном хосте) –

Смежные вопросы