ui路由器和浏览器历史问题

时间:2016-03-30 17:47:23

标签: angularjs angular-ui-router

我正在使用带有我的应用程序的角度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
    }); 
  }
});

此时我不确定还提供了哪些代码,如果需要其他任何内容,请告诉我。我认为状态更改存储在浏览器历史记录中的方式可能存在一些问题。如果发生这种情况,请告诉我如何才能确定我的代码中的哪一部分会导致它。

1 个答案:

答案 0 :(得分:0)

由于您没有提供任何代码,我无法确定您是否已经尝试过此操作,但是THIS答案可能会帮助您