如何在浏览器刷新时保留ui-router参数

时间:2015-10-16 18:41:43

标签: angularjs angular-ui-router page-refresh

使用角度ui-router来管理我的SPA的状态。 我有这条路线:

    .state('index.administration.security.roleEdit', {
                url: '/roleEdit',
                templateUrl: 'app/administration/security/role/roleEdit.html',
                controller: 'roleEditCtrl',
                controllerAs: 'roleEditCtrl',
                params: { data: null },
                resolve: {
                    role: function ($stateParams) {
                        return angular.fromJson($stateParams.data);
                    },
                    modules: function (securityService) {
                        return securityService.getAllModules();
                    }                       
                }
            })

另外,我传递了数据'参数为json对象的状态。 现在当我第一次加载这个状态时,一切都很好。 但是当我进行浏览器刷新(F5键)时,$ stateParams.data在状态的解析函数中为空。

我该如何解决这个问题? 我看到这些可能的解决方案 1.坚持某种参数 2.覆盖浏览器刷新(不知道如何)以停止浏览器刷新应用程序。 3.刷新其他兄弟姐妹状态。

请帮忙

更新 好的,我设置了这样的数据:

vm.editRole = function(roleId){
     var role = dataService.getRoleById(roleId).then(function(result){
           $state.go('roleEdit', {data:angular.toJson(result)});
           });
}

更新2 roleEdit控制器如下所示:

(function(){
    angular.module('app.administration').controller('roleEdit', 
    ['role','modules', '$scope', 'securityService', '$state', roleEditCtrl]);

    function roleEditCtrl('role', 'modules',$scope, securityService, $state){
        var vm = this;
        vm.roles = roles;
        vm.originalRole = angular.copy(role);
        vm.modules=modules;
        vm.saveChanges = _saveChanges;
        vm.cancel = _cancel;

        return vm;

        function _saveChanges(){
            securityService.UpdateRole(vm.role).then(function(result){
                $staste.go('^.roles');
            }
        }

        function _cancel(){
            vm.role = angular.copy(vm.originalRole);
            $sscope.roleEditForm.$setPristine();            
        }
    }
})();

2 个答案:

答案 0 :(得分:1)

遇到同样的问题,请留下这个以防其他人需要它。使用localStorage解决了这个问题。

我已将此设置为应用的run方法

的一部分
$rootScope.$on('$stateChangeSuccess', function (event, toState) {
    localStorage.setItem('__stateName', toState.name);
});

现在,根据您的应用程序的结构,您可能需要考虑将其放在其他位置,但在我的情况下,我有所有子控制器的父AppController,所以这部分代码就在那里。

var previousState = localStorage.getItem('__stateName');
previousState && $state.go(previousState) || $state.go(<SOME_OTHER_ROUTE>);

基本上,当用户点击浏览器刷新时,AppController从开始(在子控制器之前)初始化,如果有的话,立即触发状态转换。否则,你会去其他一些州。

答案 1 :(得分:0)

我会远离选项2.你不想搞砸浏览器的预期行为。

也许你可以将你的数据重构到你的解析对象ala:

{{1}}

如果dataService真的那么重要(通过cookies或localstorage),那么dataService就是用来存储数据的服务。

如果您之前执行了javascript以向其传递有状态值,则没有合理的方法可以在浏览器刷新时填充该字段。