更改URL中断路由阻止

时间:2016-07-08 19:27:48

标签: angularjs angular-ui-router

如果是第一次登录用户,我需要阻止路由,他们必须留在设置页面重置密码在做其他事情之前(或转到其他页面),代码现在99%工作,我可以更改<form method="post">刷新页面,它工作正常但只有一个问题。这是代码:

url/

网址如下:https://localhost/app/#/account/security/true 正如我所提到的,我可以刷新页面或更改网址,如:https://localhost/app/#/accounthttps://localhost/app/# 他们都工作正常,但当我改变这样的网址时: https://localhost/app/我会转到主页。我检查了控制台,在.state('accountsetting.security', { url: '/security/{isFirstTimeUser}', templateUrl: 'settings/security/security.html', params: {'isFirstTimeUser': null} }) // this is where I define the route // in the run block .run(['$state','$rootScope',function($state,$rootScope) { // var isFirstTimeUser = false; // userinforservice.getUserInformation().then(function(data){ // isFirstTimeUser = data.isFirstTimeUser; // }); $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { if(fromState.name!=="undefined" && toState.name=='firsttimeuser'){ $rootScope.isFirstTimeUser=true; $state.go('accountsetting.security',{isFirstTimeUser:true}); event.preventDefault(); }else if((toParams.isFirstTimeUser || fromParams.isFirstTimeUser) && toState.name !='accountsetting.security'){ $state.go('accountsetting.security',{isFirstTimeUser:true}); event.preventDefault(); } else{ return; } }); }]); 中,我丢失了statechangestart,它是isFirstTimeUser。有什么想法吗? 提前谢谢。

3 个答案:

答案 0 :(得分:5)

当你转到根的url而不是状态url(即)#(hash)url时,你会失去角度状态。根URL重新加载页面,其中您丢失了所有javascript变量的内存,因为它们都是客户端。因此变量是未定义的。

状态更改发生在单个页面加载实例中,网址更改会给您一种错觉,就像发生页面加载一样

答案 1 :(得分:2)

导致此行为的问题由Shintus answer描述。

可能的解决方案是确保正确解决事件顺序。我认为在$stateChangeStart解决之前会触发userinforservice.getUserInformation()。您可以在$stateChangeStart内查询返回的承诺,而不是在任何未定义的时间分配变量,而不是并行调用它们。

.run(['$state','$rootScope',function($state,$rootScope) {
    var storedUserPromise;
    storedUserPromise = userinfoservice.getUserInformation();

    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
        storedUserPromise.then(function(data) {
            if(data.isFirstTimeUser) {
                //do redirection logic here
            }
        })
    });
}]);

存储用户承诺只允许您调用userinfoservice.getUserInformation()一次的开销。之后,存储的承诺上的任何.then都会立即解决。

PS:你可能在userinfo>r<service;)

中输了一个拼写错误

答案 2 :(得分:1)

您可以使用$routeProvider.when.resolve拦截路径定义中的任何路径加载,在解析块中检查它们的状态并重定向它们或您想要执行的任何其他操作。

Tutorial Example showing the below code snippet:

index