AngularJS - 在$routeChangeError后删除最后一个历史记录条目

4
我有一个名为“route”的路由,需要解析服务器端资源。该资源需要进行身份验证。因此,我展示了一个可取消的登录表单弹出窗口。当取消时,路由/解析被拒绝,并且$routeChangeError正确地触发。
问题在于,现在我有了失败的位置/ URL和不必要的历史记录条目。
如何在不重新加载页面的情况下将当前位置URL替换为上一个?在路由更改失败后如何删除当前历史记录条目?
编辑: 我使用angular-http-auth。 以下是我的路由:
/home> /item(必须解析需要身份验证的资源,未登录时会打开可取消的登录表单弹出窗口)
当我取消身份验证时,$routeChangeError被触发,由于/item从未呈现,我仍然在/home页面。现在地址栏显示错误的URL:/item
1个回答

2
你只需要在历史记录中回退一步即可。不用担心历史记录会留在那里,当他们浏览到下一个内容时,它将被覆盖掉:
app.run(function($rootScope, $window) {
   $rootScope.$on('$routeChangeError', function () {
      $window.history.back();
   });
});

And here's a demo Plunk


谢谢,但这会重新加载我已经/仍在看的页面。我使用angular-http-auth,并在需要身份验证的路径上(带有解析器)开启登录弹出窗口。当我取消该登录弹出窗口时,我可以看到正确的页面,但位置错误。通过$location.replace()方法,我能够在下一次路由更改时摆脱不必要的历史记录条目。但这不是一个解决方案。我必须在$routeChangeError事件中更改$location,而无需重新加载相同的页面。 - tagomago
很遗憾,我不被允许打开一个名为“angular-http-auth”的新标签。 - tagomago
通常当您有一个被拒绝的路由更改时,您可能会显示一个错误页面。但我的登录表单是基于弹出窗口的,并且可以取消。重定向到错误页面没有意义。 - tagomago
我已经为你添加了标签。 - Ben Lesh
1
你说得对。我应该再次使用类似于我在另一个项目中已经使用过的服务。那个路由/解析的东西很有趣,但似乎受限或几乎可疑。可惜!也许 ui-router 更灵活。非常感谢! - tagomago
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接