使用$ routeProviderredirect到Angular以外的路由

我已经在Angular中编写了一个Web应用程序的一部分。 为了确保覆盖所有路由,我想向$routeProvider添加一个redirectTo属性,以便将无效路由返回到不使用Angular的Web应用程序的根目录。

我试过了:

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

但显然这只能在URL的Angular控件部分路由,所以用户将被redirect到像http://app.com/angular-part-of-web-app#这样的URL,而不是http://app.com ,我希望他们去。

我已经解决了这个问题,有一个空白部分作为'404'页面,然后是一个控制器,它只是使用$window对象redirect到所需的页面:

routes.js

 // Redirect to site list. $routeProvider.when('/404', { templateUrl: '/partials/404.html', controller: 'RedirectCtrl' }); // Redirect to the 404 page. $routeProvider.otherwise({ redirectTo: '/404' }); 

controllers.js

 // Controller to redirect users to root page of site. .controller('RedirectCtrl', ['$scope', '$window', function ($scope, $window) { $window.location.href = '/'; }]); 

不过,这正在掀起“太莽撞,一定是更好的方式”的警钟。 在Angular中有更好的方法吗?

编辑: angular路由 – redirect到外部网站? 没有回答同样的问题。 我打算把问题留下来,而不是将其标记为重复(现在),就像Angular世界移动得太快一样,以前的答案可能不再是这种情况。

上面的解决scheme/ 404不适合我。 这似乎工作

 .otherwise({ controller : function(){ window.location.replace('/'); }, template : "<div></div>" }); 

PS。 我正在使用Angular 1.2.10

你可以做这样的事情:

 $routeProvider.when('/404', { controller: ['$location', function($location){ $location.replace('/'); }] }).otherwise({ redirectTo: '/404' }); 

它本质上是一样的,只是使用较less的代码。

不知道接受的答案被写在什么版本的Angular JS上,但是'redirectTo'属性需要一个函数。 那么,为什么不做这样简单的事情:

 $routeProvider.otherwise({ redirectTo: function() { window.location = "/404.html"; } }); 

显然,你必须创build自己的404.html。 或者你的404页面在哪里。

没有答案,包括标记的答案为我工作。 我相信我的解决scheme也可以解决您的问题,我也会分享我的使用案例以供将来的读者参考。

使用路由控制器方法的问题:控制器加载时,路由已经访问了我的历史API状态(我使用HTML5模式,不知道这是否会影响非HTML5模式)。

因此,即使我可以使用window.location.replace('/')将用户转发到正确的页面,如果用户在浏览器上单击“返回”,它将进入无效状态。

场景:我们实现了多页面模型,并将我的pipe理页面模块与我的主页(非pipe理员)模块分开。 我有一个$ location.path('/')在我的pipe理控制器的某个地方,但由于主页没有打包到pipe理页面模块,我想强制整个页面重新加载,当我检测到“/”路线。

解决scheme:在ngRoute访问任何状态信息之前,我们必须在$ routeChangeStart截获。 这样我们甚至可以通过传递url到$ route中的redirectTo参数来指定外部href

 angular.module('app',['ngRoute']) .config(['$routeProvider', function($routeProvider) { $routeProvider .when('/admin/default', {template: somePageTemplate}) /* * More admin-related routes here... */ .when('/',{redirectTo:'/homepage'}) // <-- We want to intercept this .otherwise({redirectTo: '/admin/default'}); }]) .controller('MainCtrl',[ // <- Use this controller outside of the ng-view! '$rootScope','$window', function($rootScope,$window){ $rootScope.$on("$routeChangeStart", function (event, next, current) { // next <- might not be set when first load // next.$$route <- might not be set when routed through 'otherwise' // You can use regex to match if you have more complexed path... if (next && next.$$route && next.$$route.originalPath === '/') { // Stops the ngRoute to proceed event.preventDefault(); // We have to do it async so that the route callback // can be cleanly completed first, so $timeout works too $rootScope.$evalAsync(function() { // next.$$route.redirectTo would equal be '/homepage' $window.location.href = next.$$route.redirectTo; }); } }); } ]); 

请提供任何反馈,因为我将自己使用此代码。 干杯

参考: https //github.com/angular/angular.js/issues/9607

嗨,即使已经两年了,只是为了search这个答案的人,只需使用window.location.assign('/ login')即可。 这对我有用。