Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从状态提供程序的resolve方法更改angular应用程序的状态_Javascript_Angularjs_Angular Ui Router - Fatal编程技术网

Javascript 从状态提供程序的resolve方法更改angular应用程序的状态

Javascript 从状态提供程序的resolve方法更改angular应用程序的状态,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我在angular应用程序中使用ui路由器。目前我有两条路线/登录和/用户。 最初,当用户单击login按钮时,它显示/signin,我发送一个ajax请求并获取用户id。我将用户id存储在localstorage中,并将状态更改为/user 现在,我想要的是,如果用户没有登录,并且用户将地址栏更改为/user,它不会更改视图,而是会将地址栏url再次更改为/sign 我正在尝试使用resolve,但它不起作用。我的代码是:- module.exports = function($statePr

我在angular应用程序中使用ui路由器。目前我有两条路线/登录和/用户。 最初,当用户单击login按钮时,它显示/signin,我发送一个ajax请求并获取用户id。我将用户id存储在localstorage中,并将状态更改为/user

现在,我想要的是,如果用户没有登录,并且用户将地址栏更改为/user,它不会更改视图,而是会将地址栏url再次更改为/sign

我正在尝试使用resolve,但它不起作用。我的代码是:-

module.exports = function($stateProvider, $injector) {
$stateProvider
.state('signin', {
    url: '/signin',
    template: require('../templates/signin.html'),
    controller: 'LoginController'
})
.state('user', {
    url: '/user/:id',
    template: require('../templates/user.html'),
    resolve:{
        checkLogin:  function(){
             var $state = $injector.get('$state');
            console.log("in resolve");
             if (! window.localStorage.getItem('user-id')) {
                 console.log("in if")
                  $state.go('signin');
             }
        }
    },
    controller: 'UserController'
 })

}

请帮助我解决这个问题。

< P>我不认为允许在状态转换中间改变状态。

因此,解决这个问题的方法是将
checkLogin
resolve参数(我在下面将其更改为
userId
)作为一个函数,它要么返回一个值,要么返回一个承诺(在本例中,如果无法获得
用户id
,则返回一个被拒绝的承诺)

然后您需要在(“$stateChangeError”)上的
$rootScope.$on中处理此问题,并检查错误代码

resolve: {
   userId: function ($q, $window) {
      var userId = $window.localStorage.getItem('user-id');
      if (!userId) {
         return $q.reject("signin")
      }

      return userId;
   }
}
并在
$stateChangeError
处理程序中重定向:

$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
     if (error === "signin") {
        $state.go("signin");
     }
});

如果有人有这个问题,您可以使用超时服务解决它。它将把状态切换调用放在队列的末尾

此外,你应该使用承诺。拒绝它将阻止该状态的初始化:

resolve:{
    checkLogin: function(){

         var deferred = $q.defer();

         var $state = $injector.get('$state');
         if (!window.localStorage.getItem('user-id')) {
             $timeout(function(){$state.go('signin');});
             deferred.reject();
         } else {
             deferred.resolve();
         }

         return deferred.promise;
    }
},

“in-if”是否将打印机连接到控制台?谢谢,这真的很有帮助。但是假设我必须在应用程序中多次执行此类操作。假设还有一些路线,我想根据具体情况改变路线。类似地说,若用户登录,他将无法进入登录和忘记密码页面。因此,对于所有这些情况,我必须在rootscope中导航。因此,我必须添加一些if-else或switch-case,并根据它改变状态。因此,对于大型应用程序来说,这将是一个巨大的障碍。因此,我可以在状态提供程序本身中执行此操作,以便不必添加这些if-else。您不需要导航到rootscope-您只需要拒绝导航并通过适当重定向来处理不同的错误。您已经在rootscope if的statechangeerror中写入了if(error==“sign”){$state.go(“sign”);}因此,我们已经在rootscope中使用state.go完成了重定向。现在假设,如果我想这样做,如果用户登录,他将无法进入登录和忘记密码页面。因此,如果(error==“user”){$state.go(“user”);}类似这样的内容,我将编写其他代码。那么,我可以在区块中避免这个倍数吗?如果我错了,请纠正我。
$rootScope.$on
语句可以写在
app中。运行
你会得到+1的黑客攻击