2014-11-30 1 views
55

를 로그인 리디렉션 나는 4 개 상태를 가지고있다. 대시 보드는 추상이며 .minor 및 .main 상태의 부모 상태입니다. 당신은 내가 해결 옵션이 대시 보드 상태에서 보듯이Angularjs ui-router. <strong>대시 보드</strong>, <strong></strong> dahboard.main, <strong>dashboard.minor</strong>, <strong>로그인</strong> : 어떻게 페이지

.state('dashboard', { 
     url: "/dashboard", 
     abstract: true, 
     templateUrl: "views/dashboard.html", 
     resolve: { 
      auth: function ($q, authenticationSvc) { 
       var userInfo = authenticationSvc.getUserInfo(); 
       if (userInfo) { 
        return $q.when(userInfo); 
       } else { 
        return $q.reject({ authenticated: false }); 
       } 
      } 
     }, 
     controller: "DashboardCtrl", 
     data: { pageTitle: 'Example view' } 
    }) 
    .state('dashboard.main', { 
     url: "", 
     templateUrl: "views/main.html", 
     controller: "DashboardCtrl", 
     data: { pageTitle: 'Main view' } 
    }) 

: 다음은 내 코드입니다. 이를 통해 권한이없는 사용자를 로그인 페이지로 리디렉션하려고합니다.

.factory("authenticationSvc", ["$http", "$q", "$window", function ($http, $q, $window) { 
    var userInfo; 

    function login(email, password) { 
     var deferred = $q.defer(); 

     $http.post("/api/login", { email: email, password: password }) 
      .then(function (result) { 
       if(result.data.error == 0) { 
        userInfo = { 
         accessToken: result.data.accessToken 
        }; 
        $window.sessionStorage["userInfo"] = JSON.stringify(userInfo); 
        deferred.resolve(userInfo); 
       } 
       else { 
        deferred.reject(error); 
       } 
      }, function (error) { 
       deferred.reject(error); 
      }); 

     return deferred.promise; 
    } 
    function getUserInfo() { 
     return userInfo; 
    } 
    return { 
     login: login, 
     logout: logout, 
     getUserInfo: getUserInfo 
    }; 
}]); 

내가 확인 인증 값 설정 에서 :

.run(function($rootScope, $location, $state) { 
    $rootScope.$state = $state; 
    $rootScope.$on("routeChangeSuccess", function(userInfo) { 
     consol.log(userInfo); 
    }); 
    $rootScope.$on("routeChangeError", function(event, current, previous, eventObj) { 
     if(eventObj.authenticated === false) { 
      $state.go('login'); 
     } 
    }); 
}); 

그러나 불행하게도 나는 내 웹 사이트의 루트 또는 대시 보드 상태로 갈 때 빈을 얻을 이런 이유로 나는 특별한 authenticationSvc 서비스를 사용 페이지. 이 코드의 문제점은 무엇입니까? 감사!

+1

이벤트 이름은 실제로'$ routeChangeSuccess'와'$ routeChangeError'은 (주 선도적 인'$') ... 그렇게 간단하지 수를 다음과 같이 $transitions.onStart를 사용하여 목적을 달성 할 수 있을까? – Clive

답변

76

필요하지 않은 경우 리디렉션하지 않습니다. === 의도 한 상태로 이미 리디렉션 된 경우입니다. a working plunker

.run(function($rootScope, $location, $state, authenticationSvc) { 


    $rootScope.$on('$stateChangeStart', function(e, toState , toParams 
                , fromState, fromParams) { 

     var isLogin = toState.name === "login"; 
     if(isLogin){ 
      return; // no need to redirect 
     } 

     // now, redirect only not authenticated 

     var userInfo = authenticationSvc.getUserInfo(); 

     if(userInfo.authenticated === false) { 
      e.preventDefault(); // stop current execution 
      $state.go('login'); // go to login 
     } 
    }); 
}); 

점검 유사한 솔루션이 유사한 설명이 :

+0

Plunker 좋은 예입니다. – hailong

+0

다른 사람에게 주석 :이 훌륭한 답변의 코드는 필요한 것입니다.참조 된 Plunkr은 훌륭하지만 너무 장황합니다. – rinogo

+0

이 예제는 레거시 버전 (0.2)에서만 작동합니다. 최신 버전 (1.x)의 경우 다음 마이그레이션 가이드를 읽으십시오. https://ui-router.github.io/guide/ng1/migrate-to-1_0#state-change-events – terox

4

UI 라우터 모듈을 사용하고 있으므로 $stateChangeStart, 이벤트를 사용해야합니다.

확인 이상이 링크 : https://github.com/angular-ui/ui-router/issues/17

또한 콘솔에서 consol.log(userInfo)에 오타가있다.

chrome-dev-tools에서 콘솔을 확인하십시오. 뭔가 다른 것이 빠진다면 아이디어를 줄 것입니다.

+0

고마워요! 이제 인증없이 웹 사이트의 루트로 이동하면 로그인 페이지로 리디렉션됩니다.하지만 대시 보드 상태로 전환하면 빈 페이지가 나타납니다. – Yelnar

+0

브라우저의 콘솔에 표시되는 내용을 확인 했습니까? –

+0

오늘 대시 보드 상태에 '해결 :'이라는 동일한 시나리오가 있습니다. 그러나, 내 app.js 감시자 ('$ rootScope. $ on ('$ stateChangeStart'')에, 그것은 event.preventDefault();에 걸려있다 각도의 무한 루프 오류가 발생했는데 왜 그럴까? –

0

가 실제로 $stateChangeSuccess 이벤트가 이되지 않습니다주의 더 이상 사용할 수있는 angular-ui-route p ackage. 이제이 동작은 transition hooks에 의해 처리됩니다.

run.$inject = ['$transitions', 'authenticationSvc']; 
function run($transitions, authenticationSvc) { 

    $transitions.onStart({}, function (trans) { 
    var userInfo = authenticationSvc.getUserInfo(); 

    var $state = trans.router.stateService; 

    if(userInfo.authenticated === false) { 
     $state.go('login'); // go to login 
    } 
    }); 
}