AngularJSredirect,无需推送历史状态

我正在开发一个AngularJS应用程序,它有一个捕获所有路线(例如, .when('/:slug', {...) ),这是从以前的(非angular度)版本该应用程序。 响应catch的控制器都会尝试提取一个相关的对象,如果没有find的话,使用$location.path方法redirect到404页面。 这样可以使用户进入404页面,但是当用户在浏览器中回到页面时,他们会将页面拉回到404页面,并最终无法摆脱循环。

我的问题是,如果有1)更好的模式来处理这种情况,或2)如果有一种方法来重新路由用户不强制在浏览器中的历史推状态?

您可以更改url,而无需添加历史logging状态,在“replace方法”下find此处 。 这与调用HTML5的history.replaceState()实际上是一样的。

 $location.path('/someNewPath').replace(); 

我还没有发现可以更改视图而不更改url。 我发现,改变视图的唯一方法是更改​​位置path。

路由系统的正常运行是$route服务监视$locationChangeSuccess事件,然后开始加载一个路由。 完成加载模板后,执行parsing步骤并实例化控制器,然后再广播一个$routeChangeSuccess事件。 $routeChangeSuccessng-view指令监视,这就是它知道一旦新的路由准备好就交换出模板和范围。

有了上述所有的内容,可以使应用程序代码模拟$route服务的行为,方法是更新当前路由并发出路由更改事件以获取更新视图:

 var errorRoute = $route.routes[null]; // assuming the "otherwise" route is the 404 // a route instance is an object that inherits from the route and adds // new properties representing the routeParams and locals. var errorRouteInstance = angular.inherit( errorRoute, { params: {}, pathParams: {}, } ); // The $route service depends on this being set so it can recover the route // for a given route instance. errorRouteInstance.$$route = errorRoute; var last = $route.current; $route.current = errorRouteInstance; // the ng-view code doesn't actually care about the parameters here, // since it goes straight to $route.current, but we should include // them anyway since other code might be listening for this event // and depending on these params to behave as documented. $rootScope.broadcast('$routeChangeSuccess', errorRoute, last); 

以上假设您的“其他”路线没有任何“解决”的步骤。 它也假定它不指望任何$routeParams ,这对于“否则”路由当然是正确的,但是如果你使用不同的路由可能不是真的。

目前尚不清楚以上内容取决于实施细节与界面。 $routeChangeSuccess事件肯定是有logging的,但路由实例的$$route属性似乎是路由系统的实现细节,因为它的双美元符号名称。 “否则”路由与关键字null一起保存在路由表中的细节也可能是一个实现细节。 所有这一切说,这种行为可能不会在未来版本的AngularJS中保持function。

有关更多信息,可以参考处理这个事件的ng-view代码,这个代码最终是为了取悦上面的代码,以及作为上面例子的基础的事件发出代码 。 从这些链接可以推断出,这篇文章中的信息来自于AngularJS的最新主分支,在撰写本文时,它被标记为1.2.0-snapshot。