Angular ui-router解析两次

时间:2016-05-03 17:14:51

标签: angularjs angular-ui-router

这让我在过去几个小时里疯狂,我找不到解决方案......

当解析返回http 404状态代码时,我基本上将状态更改为404。我正在改变$stateChangeError事件中的状态。一切正常,除非状态变为404后,它开始另一个状态更改回原来的状态,从而解析两次。状态本身仍然在404,所以它毕竟有效,但它仍然会产生额外的$http个不需要的请求。但是,如果我使用$state.go('404', null, { location: false })或者如果404状态根本没有定义URL,则它只能这样工作。

如果我为404州(/404)定义了网址,那么一切正常。

以下是2支钢笔,展示了这个问题:

失败的一个:http://codepen.io/cprfnaporf/pen/RaqmQN(调试模式,检查控制台:http://s.codepen.io/cprfnaporf/debug/RaqmQN/

正常工作:http://codepen.io/cprfnaporf/pen/MyzdVQ(调试模式,检查控制台:http://s.codepen.io/cprfnaporf/debug/MyzdVQ/

知道如何解决这个问题吗?我真的没有想法。

谢谢!

2 个答案:

答案 0 :(得分:4)

对我来说,你已经找到了解决方案。 实际上,如您的代码中所述:

$urlRouterProvider.when('/', '/profile/x/details');

默认网址为/profile/x/details。当ui-router看到时 该网址会尝试加载状态层次结构:basebase.profile et base.profile.details。正如您所说,由于您遇到404错误并将请求重定向到其他位置,因此不会加载最后一个。

问题是您仍然位于/profile/x/details。因此,在stateChangeError中,当您执行$state.go('404', null, { location: false });时,ui-router将检查网址。

由于未在404中设置,因此他会选择他拥有的那个:/profile/x/details。 这就是他解决相同状态层次结构的原因:basebase.profile et base.profile.details

答案 1 :(得分:4)

@Andrew我想我不确定你的目标是什么,但似乎你正在与ui-router的工作方式作斗争。

@Zakaria在总结问题方面做得很好。

也许退一步看看将用户置于死页或部分死页是否真的有意义。如果您尝试处理失败的解决方案,那么可能会捕获404(或失败的请求)并返回默认解析而不是移动到新的错误状态。将when语句保留在$urlRouterProvider.when('/', '/profile/x/details');,您只会遇到目前设计的问题