使用角度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();
}
}
})();
答案 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以向其传递有状态值,则没有合理的方法可以在浏览器刷新时填充该字段。