这让我在过去几个小时里疯狂,我找不到解决方案......
当解析返回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/)
知道如何解决这个问题吗?我真的没有想法。
谢谢!
答案 0 :(得分:4)
对我来说,你已经找到了解决方案。 实际上,如您的代码中所述:
$urlRouterProvider.when('/', '/profile/x/details');
默认网址为/profile/x/details
。当ui-router
看到时
该网址会尝试加载状态层次结构:base
,base.profile
et base.profile.details
。正如您所说,由于您遇到404错误并将请求重定向到其他位置,因此不会加载最后一个。
问题是您仍然位于/profile/x/details
。因此,在stateChangeError
中,当您执行$state.go('404', null, { location: false });
时,ui-router
将检查网址。
由于未在404
中设置,因此他会选择他拥有的那个:/profile/x/details
。
这就是他解决相同状态层次结构的原因:base
,base.profile
et base.profile.details
。
答案 1 :(得分:4)
@Andrew我想我不确定你的目标是什么,但似乎你正在与ui-router的工作方式作斗争。
@Zakaria在总结问题方面做得很好。
也许退一步看看将用户置于死页或部分死页是否真的有意义。如果您尝试处理失败的解决方案,那么可能会捕获404(或失败的请求)并返回默认解析而不是移动到新的错误状态。将when
语句保留在$urlRouterProvider.when('/', '/profile/x/details');
,您只会遇到目前设计的问题