我正在使用带有我的应用程序的角度UI路由器,它启用了html5路由(angular的html5模式)。
我主要使用ui-sref从一个州导航到另一个州,它运行正常。但是,有时当我使用浏览器后退按钮时,没有任何反应。请注意,这是一个活动。当它确实工作时,当我尝试使用我的浏览器控件“前进”时,没有任何反应,我仍然保持相同的状态。我所有的州都有独特的网址。我有点陷入这个问题,无法继续。任何指针都会有所帮助。
这是我设置应用程序基本路径的方式:
<base href="/" target="_blank">
这就是我的路由器设置:
$stateProvider
.state("base",{
abstract: true,
url: "/app",
template: "<div ui-view></div>"
})
.state("login", {
url: "/login",
parent: "base",
templateUrl: "somePath",
controller: "loginController"
})
.state("auth",{
abstract: true,
parent: "base"
resolve: {
user: function(StateService){
return StateService.getCurrentUser();
}
}
})
.state("state1", {
url: "/state1",
parent: "auth",
templateUrl: "somePath",
controller: "state1Controller"
})
.state("state2", {
url: "/state2",
parent: "auth",
templateUrl: "somePath",
controller: "state2Controller"
});
我基本上有一些基本状态,我解决了一些问题,并为其余的子状态添加了基本路径。然后我有另一个抽象状态,我解析我当前的用户。它有许多子状态,每个状态只能由登录用户访问。
StateService
有一个函数getCurrentUser
,它请求从我的后端获取当前用户的详细信息。我的后端维护一个会话,其中包含当前用户的详细信息。如果会话中没有用户,则返回401.为此,我将用户重定向到登录页面。如果没有,我只是继续,UI路由器负责其余的工作。现在,让我们假设我不将此用户存储在cookie上,因此如果刷新页面,请求将再次发送到我的后端。
我也有一些拦截器。他们会听取$stateChangeStart
事件以获取其他一些应用程序逻辑。例如,如果用户已经登录并且他/她尝试转到登录页面,我会停止状态更改并将用户重定向到某个默认状态(比如说state1)。这些是在我的应用程序的运行块中注册的。
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState) {
if(toState && toState.url =="/login"){
StateService.getCurrentUser()
.then(function(user){
$state.go("state1")
})
.catch(function(){
// no problem, go ahead
});
}
});
此时我不确定还提供了哪些代码,如果需要其他任何内容,请告诉我。我认为状态更改存储在浏览器历史记录中的方式可能存在一些问题。如果发生这种情况,请告诉我如何才能确定我的代码中的哪一部分会导致它。