2014-09-26 3 views
4

서비스$stateProvider 이내에 사용해도 괜찮습니까?AngularJS - 앱 시작 전 경로 처리

나는 라우팅과 관련하여 많은 게시물을 보았지만 모든 사람들이 다른 접근 방식을 사용하고 로켓 과학처럼 다루기 때문에 초보자에게 혼란을주고 있습니다. 나는 처음부터 좋은 습관을 개발하고 나쁜 습관을 피하고 싶습니다. ...

목표 : 응용 프로그램이 시작되기 전에 일부 기능을 실행하고 최종 사용자에게 출력 경로를 기반으로합니다.

은 >>AuthService을 서비스 구현 | :

은 내가 시도 무엇 토큰

  • 인증 서버로 보내기
  • 응답 (부울) 주요 기본 사항 + API를 포함
  • 경우 -

    1. 클라이언트 사이드 (SQLite는 DB)에서 JWT 토큰을 가져 오기 : 간단한 검사 >> 작업 인증 된 >>로드 홈보기. 그렇지 않으면 뷰 등록으로 리디렉션하십시오.
    2. 서버 측 유효성 검사는보기

    서비스 제공

    myApp.factory('AuthService', function (Session) { 
         var authService = {}; 
          authService.isAuthorized = function(){ 
          return Session.authorized() ; 
         }; 
         return authService; 
    }); 
    
    
    myApp.service('Session', function ($resource, $q, $timeout, URL_Config) { 
        this.authorized = function() { 
         var deferred = $q.defer(); 
         $timeout(function() { 
          var db = window.openDatabase("config.db", "1.0", "Config", 2 * 1024 * 1024); 
          db.transaction(function (tx) { 
           tx.executeSql("SELECT * FROM user_details", [], function (tx, data) { 
            var token = data.rows.item(0).token; 
            var request = $resource(URL_Config.BASE_URL + '/authCheck', {token: token }, 
             { query: { 
              isArray: false, 
              method: 'GET' 
             } }); 
            request.query(function (res) { 
             if (res.error) { 
              deferred.resolve(false); 
             } else { 
              deferred.resolve(true); 
             } 
            }); 
    
           }, function (e) { 
            deferred.resolve(false); 
           }); 
          }); 
         }, 500); 
         return deferred.promise; 
        }; 
    
    return this; 
    }); 
    

    경로 구성

    이 내가 고민하고있는 부분을로드하기 전에 일어난다. 이 서비스를받는 곳과 방법 나는 그것이 작동하지만, 이것이 올바른 방법인지 여부를 확신 할 수 없다.

    • 전화 $stateProvider의 해결 재산권 내 서비스?
    • 을 기준으로 AuthService의 값은보기로 리디렉션됩니다.
    • 응용 프로그램 시작 전의 프로세스.

    myApp.config(function($stateProvider, $urlRouterProvider) { 
        $urlRouterProvider.otherwise('/home'); 
        $stateProvider 
        .state('home', { 
         url: '/home', 
         templateUrl: 'templates/home.html', 
         controller: 'MainController', 
         resolve: ['AuthService', function(AuthService, $location, $q){ 
          var deferred = $q.defer(); 
          var authChk = AuthService.isAuthorized(); 
          authChk.then(function(data){ 
           if(!data){ 
            $location.path('/register'); 
            deferred.resolve(); 
           } else{ 
            $location.path('/home'); 
            deferred.resolve(); 
           } 
          }, function(e){ 
           $location.path('/register'); 
           deferred.resolve(); 
          }); 
          return deferred.promise; 
         }] 
        }) 
        .state('register', { 
         url: '/register', 
         templateUrl: 'templates/register.html', 
         controller : 'RegisterController', 
         resolve: ['AuthService', function(AuthService, $location, $q){ 
          var deferred = $q.defer(); 
          var authChk = AuthService.isAuthorized(); 
          authChk.then(function(data){ 
           if(!data){ 
            $location.path('/register'); 
            deferred.resolve(); 
           } else{ 
            $location.path('/home'); 
            deferred.resolve(); 
           } 
          }, function(e){ 
           $location.path('/register'); 
           deferred.resolve(); 
          }); 
          return deferred.promise; 
         }] 
        }) 
    }); 
    

    이는 인증 유효성 검사를 실행할 수있는 적절한 장소인가?

    이것은 Angular로 시작하는 데 필요한 간단한 Hello World 데모입니다. 나는 항법 (다중보기)이 없기 때문에 수표는 앞으로 나아갈 것입니다.

    보기가로드되기 전에 locationChangeStart을 사용하여 서비스를 시작하는 많은 예제를 보았습니다. 그런 다음 $scope.watch$broadcast은 세션을 처리 할 때 사용되지만 나중에 사용하기에 유용 할 수 있습니다.

    감사합니다. 이 시나리오를 처리 할 방법과 장소에 대한 조언을 환영합니다.

  • 답변

    0

    이것은 실제로 내가해야 할 일입니다. 각 상태에서 resolve을 사용할 수 있습니다.

    아래 코드에는 사용자 개체를 반환하는 resolveUserAuth 함수가 있습니다.

    var resolveUserAuth = { 
        'userAuth': function (AuthService, $rootScope) { 
         if ($rootScope.user) { 
         return $rootScope.user; 
         } else { 
         return myApp._getUserAuth(AuthService, $rootScope); 
         } 
        } 
        }; 
    
        $stateProvider 
        .state('login', { 
         url: '/login', 
         templateUrl: 'views/login.html', 
         controller: 'LoginCtrl' 
        }) 
        .state('logout', { 
         url: '/logout', 
         templateUrl: 'views/login.html', 
         controller: 'LoginCtrl' 
        }) 
        .state('home', { 
         url: '/home', 
         templateUrl: 'views/home.html', 
         controller: 'HomeCtrl', 
         resolve: resolveUserAuth 
        }) 
    

    getUserAuth

    myApp._getUserAuth = function (service, rootScope) { 
        return service.getRole().then(function() { 
        service.getUser().then(function (user) { 
         rootScope.user = user; 
        }); 
        }); 
    }; 
    

    로그인

    service.login = function (data) { 
        var promise = $http.post('/auth/login', data).then(function (response) { // Success 
         $rootScope.user = response.data; 
         AssignedService.get({}, 
         function(assigned) { 
          $rootScope.assigned = assigned; 
          $rootScope.showLogin = false; 
         }, function(error) { 
          if (console && console.error) { 
          console.error('Error getting assigned: ', error); 
          } 
         } 
        ); 
         return response; 
        }, function() { // Error 
         $rootScope.showAlert('Unable to login, please try again', 'danger'); 
        }); 
    
        return promise; 
        };