2013-08-08 32 views
7

Trong một tuyến đường AngularJS nộp có phải là lựa chọn cho một con đường otherwise, thay thế 404:Tuyến đường góc - chuyển hướng đến một trang web bên ngoài?

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

Có cách nào để làm điều này như vậy mà nếu không thì chuyển hướng đến một trang mà không có trong các ứng dụng? Tôi đã thử

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

nhưng jsut này đã cố chuyển hướng đến đường dẫn đó trong ứng dụng của tôi, vốn không tồn tại. Giải pháp tôi biết là thực hiện chuyển hướng thủ công trong một $scope.$on('$routeChangeStart') trong một bộ điều khiển cấp cao nhất, nhưng điều này là rất nhiều sao chép mã (và nó xấu xí). Có cách nào tốt hơn?

Trả lời

4

Để knowledge của tôi, điều này là không thể, vì routeProvider chỉ xử lý các tuyến nội bộ.

gì bạn có thể làm dù là

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

và sau đó chỉ cần sử dụng window.location.href = 'http://yourExternalSite.com/404.html' trong bộ điều khiển.

2

Tôi sẽ không khuyên bạn chỉ sử dụng window.location.href trong bộ điều khiển mới như được chỉ ra trong câu trả lời khác vì ngRoute sẽ đặt lịch sử trỏ vào trang không tồn tại (vì vậy khi người dùng nhấp vào nó sẽ giữ lại chuyển hướng đến trang 404). Tôi đã thử và thất bại.

Tôi muốn chỉ cho bạn giải pháp liên quan của tôi để một SO câu hỏi ở đây: https://stackoverflow.com/a/27938693/1863794

Tôi chấp nhận điều đó và áp dụng cho kịch bản của mình. Tôi không nghĩ rằng đó là xấu của một ý tưởng để sử dụng MainCtrl bên ngoài ng-view vì nó sẽ chỉ được khai báo một lần trừ khi bạn có các lớp lồng nhau của ng-view ... Tôi không thấy bất kỳ sự sao chép mã nào, bạn có thể đặt MainCtrl trong một mô-đun riêng biệt nếu nó làm phiền bạn rất nhiều:

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

Cheers

4

trong trường hợp của tôi, điều này đã làm việc cho tôi:

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

sửa chữa này đã làm việc cho tôi (chuyển hướng đến tài nguyên phi góc trên cùng một máy chủ) –

Các vấn đề liên quan