我们使用的是最新版本的Angular和AngularUI路由器
用户位于某个页面/foo
。他们点击链接导航到/bar
。 bar
状态定义了一个从服务器获取某些数据的解析函数。为了处理故障情况,我们有一个$stateChangeError
处理程序来检查错误并带您到正确的错误页面(例如500,403,401等)。当用户确实遇到/bar
的错误时,他们会遇到类似/errors/500
的错误。但是,这是不对的。当您导航到网络上的网址并遇到错误时,您最终应该输入的网址您打算转到的网址。即如果您遇到500 /bar
错误,您的位置应为/bar
。
是否有人在ui-router
中发现了这一点?事情在尝试:
toState
和toParams
构建目标网址,然后在转到错误页面后在错误处理程序中调用$ location.url / path。这将重新运行路由并尝试再次获取数据。 history.replaceState
。这似乎与ui-router混乱,似乎触发了意外的状态变化。/errors/500
。这打破了后退按钮。如果您登陆页面并且服务器在尝试加载时返回错误,则错误处理程序会将状态更改为错误页面,因此当您点击后退按钮时,您将返回/foo
并尝试要再次解决并再次遇到错误,请将您带回/errors/500
。答案 0 :(得分:4)
我所做的是创建一些错误状态,例如:
.state('notFound', {
url: '/errors/404',
template: '<h1>Not Found</h1>'
})
.state('accessDenied', {
url: '/errors/403',
template: '<h1>Access Denied</h1>'
})
然后,当您处理错误时,请添加选项以不更新位置:
$state.go('notFound', {}, {location: false});
这会导致更改为notFound状态,但不会更新浏览器地址栏,因此用户仍然可以根据需要查看以前的URL。
答案 1 :(得分:2)
这是一个非常有趣的问题,我有点想知道如何正确地做到这一点!
我对此的看法是使用附加到主控制器的服务来处理导航状态。
我执行以下操作:
{code:403, reason:'Nope ! No way !'}
)希望有所帮助! :)
PS :(如果你有兴趣,我可以带一个工作实例,但是现在我有点太累了)