Angularjs 角度-UI路由器-嵌套状态-浏览器后退按钮未按预期工作

Angularjs 角度-UI路由器-嵌套状态-浏览器后退按钮未按预期工作,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我有一个场景,其中我有以下嵌套状态结构: root root.item1 root.item2 root状态有一个模板,显示在子状态中设置的一些变量。它还需要首先运行,因为它具有确定将加载哪个子状态的逻辑 如果root确定需要加载root.item2,则事件流为: exec root -> redirect to root.item2 -> exec root.item2 现在,如果我们重定向到root.item1,然后他们按Browser Back按钮,我希望重定向到r

我有一个场景,其中我有以下嵌套状态结构:

root
  root.item1
  root.item2
root
状态有一个模板,显示在子状态中设置的一些变量。它还需要首先运行,因为它具有确定将加载哪个子状态的逻辑

如果
root
确定需要加载
root.item2
,则事件流为:

exec root -> redirect to root.item2 -> exec root.item2
现在,如果我们重定向到
root.item1
,然后他们按Browser Back按钮,我希望重定向到
root.item2
,但看起来url刚刚被清除,您根本看不到加载的任何子状态

下面是一个说明问题的例子

在Plunker中重现问题的步骤:

  • 让它加载
    root.item2
  • 单击
    转到详细信息1
  • 请注意,您位于
    root.item1
  • 单击浏览器后退按钮
  • 请注意,您不在
    root.item2
  • 提交到UI路由器的Gihub页面。希望能从那里得到一些帮助

    感谢您的帮助


    显示问题的代码:

    angular
    .module('historyApp'[
    “ui.router”
    ]) 
    .config(['$stateProvider','$urlRouterProvider',
    函数($stateProvider,$urlRouterProvider){
    $stateProvider
    .state('根'{
    url:“/”,
    模板:'Parent{{vm.title}}',
    控制器:函数($scope,$state){
    $scope.vm={title:'};
    //确定将加载哪个子状态的某些条件登录:
    var variableChildState='root.detail2';
    $state.go(variableChildState);
    }
    })
    .state('root.detail1'{
    url:“/detail1”,
    模板:“详图1至详图2”,
    控制器:函数($scope,$state){
    $scope.vm.title='Set in 1';
    }
    })
    .state('root.detail2'{
    url:“/detail2”,
    模板:“详图2至详图1”,
    控制器:函数($scope,$state){
    $scope.vm.title='Set in 2';
    }
    })
    $urlRouterProvider。否则('/');
    }
    ])
    .run(函数($rootScope,$location){
    $rootScope.$on(“$stateChangeStart”,
    函数(事件、toState、TopArms){
    console.log(toState)
    });
    })
    ;
    
    我认为这是一个简单的语法解决方案:

    .state('root.detail1', {
        url: 'detail1',
        template: '<h1>Detail 1</h1><a ui-sref="root.detail2">Go to Detail 2</a>',
        controller: function($scope, $state){
            $scope.vm.title = 'Set in 1';
        }
      })
    
    .state('root.detail1'{
    url:'detail1',
    模板:“详图1至详图2”,
    控制器:函数($scope,$state){
    $scope.vm.title='Set in 1';
    }
    })
    
    注意:url:'detail1'而不是url:'/detail1'


    希望能有所帮助。

    它的触发
    $stateChangeStart
    事件在my endYou right上,它确实触发了它。它只是不会重定向回您所在的子状态。我更新了当页面加载时,根状态的控制器只加载一次。如果添加
    console.log($state)
    加载此控制器时,您可以看到它记录一次,然后转到state1,在浏览器中回击不会导致它再次记录状态,因为控制器没有重新加载。@gonkan是的,我不需要每次都执行
    根目录下的控制器。装载过程中只需一次。这似乎和预期的一样。我用“重现问题的步骤”更新了问题。@gonkan认为您是用户。忘记代码吧。您看到的是,您位于第
    页root.item2
    。单击“转到
    根目录.item1
    ”。你到了那里。你点击后退按钮。您希望在
    root.item2
    上,因为您最初在那里,但现在不在那里。