如何使用$ state.go重定向

时间:2014-10-01 02:07:08

标签: angularjs angular-ui-router

我尝试在第三方登录后将用户重定向到信息中心。但是当成功回调被触发时,应用程序仍然在登录页面上,没有任何反应。如果我刷新浏览器,我的拦截器捕获已登录并更改为仪表板...我的登录控制器如下所示:

ThirdParty.login(function(result){
callbackSUCCESS(result);
},function(){});


function callbackSUCCESS(result){
          AuthenticationService.login(result).then(
                            callbackServerSUCCESS(), function(reject) {
                                callbackServerERROR(reject);
                            });

    }
function callbackServerSUCCESS() {

                $scope.$apply(function() {
                    $state.go('dashboard');
                });
            }

我在app.js中的路线

$stateProvider
    .state('dashboard', {
        url: '/dashboard',
        views: {
            '': {
                templateUrl: 'views/dashboard/dashboard.html',
                controller: 'DashboardCtrl'
            }
        }
    });

我的标头控制器

.controller('HeaderCtrl', ['$scope', 'AuthenticationService', '$state',
        function($scope, AuthenticationService, $state) {

            $scope.logout = function() {
                AuthenticationService.logout().then(callbackServer(), callbackServer());
            };

            function callbackServer() {
                $state.go('login');
            }
        }
    ]);

身份验证控制器Angular Factory

 var headersConfig = {   
     'Cache-Control': 'no-cache',
     'Pragma': 'no-cache'
 };

 return {
     login: function(credentials) {
         var deferred = $q.defer();

         $http.post('/api/users/sign_in', sanitizeCredentials(credentials), {
             headers: headersConfig,
             timeout: deferred.promise
         }).then(function(result) {
             if (result.status === 200) {
                 UserSessionService.cacheSession(result.data);
                 deferred.resolve();
             } else {
                 deferred.reject();
             }
         }, function(reject) {
             UserSessionService.clean();
             deferred.reject(reject);
         });

         $timeout(function() {
             deferred.resolve();
         }, 15000);

         return deferred.promise;
     }
 };

2 个答案:

答案 0 :(得分:1)

我无法记住$state.go的确切语义,但通常在响应Angular无法识别的事件时需要以某种方式使用$scope.$apply,以确保消化循环发生。即你可以尝试:

ThirdParty.login(function(result) {
    $scope.$apply(function() {
        $state.go('dashboard');
    });
}, function() {});

你需要从某个地方获得对范围的引用,但是在Angular应用程序中找不到一个范围。

答案 1 :(得分:0)

摆脱

中的()
then(callbackServer(), callbackServer())