10

在 AngularJS 路由文件中,有一个otherwise路由选项,替换了 404:

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

有没有办法做到这一点,否则重定向到不在应用程序中的页面?我试过了

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

但是这个jsut试图重定向到我的应用程序中不存在的那个路径。我知道的解决方案是$scope.$on('$routeChangeStart')在顶级控制器中进行手动重定向,但这是很多代码重复(而且很难看)。有没有更好的办法?

4

4 回答 4

6

据我所知,这是不可能的,因为routeProvider只处理内部路由。

你可以做的是

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

然后window.location.href = 'http://yourExternalSite.com/404.html'在控制器中使用。

于 2013-08-08T16:37:10.970 回答
5

就我而言,这对我有用:

$routeProvider
.when('/my-path', {
    ...typical settings...
}).
.otherwise({
        redirectTo: function(obj, requestedPath) {
            window.location.href = appConfig.url404;
        }
});
于 2016-01-12T16:48:54.237 回答
5

看看angular.js 链接行为 - 禁用特定 URL 的深度链接

并使用它

目标="_self"

<a href="link" target="_self" >link</a>
于 2016-03-27T16:29:43.980 回答
2

我不建议只在新控制器中使用 window.location.href ,因为 ngRoute 会将历史记录设置为指向不存在的页面(因此当用户单击返回时,它将继续重定向到 404页)。我试过了,但失败了。

我想在这里向您指出我对另一个 SO 问题的相关解决方案: https ://stackoverflow.com/a/27938693/1863794

我采用了它并应用于您的场景。我不认为MainCtrl在 ng-view 之外使用它是一个坏主意,因为它只会被声明一次,除非你有嵌套的 ng-view 层......我也没有看到任何代码重复,你如果 MainCtrl 非常困扰您,可以将 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;
        });
      }
    });
  }
]);

干杯

于 2015-01-14T08:56:15.113 回答