2016-06-29 2 views
0

로그인 페이지에서 설정 페이지로 첫 번째 사용자에게 일부 설정 작업을 지시하려고합니다. (기존 사용자 인 경우 평소와 같이 홈페이지로 이동합니다), 처음 사용자 인 경우 해당 설정을 완료하지 않으면 페이지의 다른 모든 링크를 비활성화 할 수 있습니다. 여기에 그것을하려는 나의 시도이지만, 어떤 이유로 작동하지 않습니다. 제발 저를 지적 해 주시겠습니까? 고마워. 당신이 볼 수 있듯이이 새로운 사용자 인 경우angularJS에서 페이지를 리디렉션하고 다른 라우터를 비활성화하는 방법은 무엇입니까?

angular.module('ecom').config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) { 
     var expenseModalInstance; 
     $urlRouterProvider.otherwise("/home"); 
     $stateProvider.state('home', { 
      url: '/home', 
      templateUrl: 'home/home.html' 
     }).state('reports', { 
      url: '/reports', 
      templateUrl: 'submitter/reports/report-list.html' 
     }).state('ebin', { 
      url: '/ebin', 
      templateUrl: 'submitter/ebin/ebin-expense-list.html' 
     })..state('accountsetting', { 
      url: '/account', 
      templateUrl: 'settings/settings.html' 
     }).state('accountsetting.security', { 
      url: '/security', 
      templateUrl: 'settings/security/security.html', 
      resolve:{ 
       userInfor: ['$stateParams', 'userinfoservice', function($stateParams, userinfoservice){ 
        var isFirstTime; 
          if ($stateParams.rid) { 
           userinfoservice.getUserinfo($stateParams.rid).then(function(data) { 
            isFirstTime = data.isFirstTimeLogin; 
           }); 
          } 
        return isFirstTime; 
        }] 
      } 
     }).run(['$state','$rootScope', function($state,$rootScope) { 
    // var isFirstTimeUser = false; 
    //  userinforservice.getUserInformation().then(function(data){ 
    //   isFirstTimeUser = data.isFirstTimeUser; 
    //   $rootScope.$broadcast('session:resolved', isFirstTimeUser); 
    //  }); 
    var isFirstTimeUser = true; 
    $rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) { 
     event.preventDefault(); 
     if(isFirstTimeUser){ 
      $state.go('accountsetting'); 
     }else{ 
      $state.go('home'); 
     } 
    }); 
}]); 

, 내가 accountsetting.security에 걸릴 것입니다, 내가 뭔가를 할 것, 그것이 사실 반환 isFirstTime 경우,이 사용자 정보를 얻기 위해 서버를 호출하는 결의를 가지고 보안 컨트롤러를 설정하고 또한 보고서, ebin 등 다른 모든 라우터를 비활성화해야합니다. 그것을 할 수있는 방법입니까? 이 일을 끝내기위한 좋은 아이디어가 있습니까?

답변

1

사용자가 페이지에 액세스 할 수 있는지 여부를 결정하려면 탐색 이벤트를 취소해야합니다. 대부분의 경우이 작업을 비동기 적으로 수행해야하므로 약간 까다 롭습니다. 나는 그것을 성취하는 한 가지 방법을 제안합니다.

앱 실행 블록에서

, 당신이 필요한 요청을 수행하는 $stateChangeStart 이벤트 처리기 추가 : 이제

module.run((function($rootScope, $urlRouter, $state, userinfoservice){ 
    var isResolved = false; 

    performSomeAsyncRequest() 
    .then(function(data) { 
    var isFirstTime = data.isFirstTimeLogin; 
    $rootScope.$broadcast('session:resolved', isFirstTime); 
    }); 

    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
    if (!isResolved && toState.name !== 'accountsetting.security') { 
     event.preventDefault(); // stop the navigation 

     var resolveListener = $rootScope.$on('session:resolved', function(event, isFirstTime){ 
     isResolved = true; 
     resolveListener() // cancel event listener 

     if (isFirstTime) { 
      $state.go('accountsetting.security'); //redirect 
     } else { 
      $urlRouter.sync(); //resume previous navigation 
     } 
     }); 
    } 

    }); 

}); 

이 아마 정확히 고정되지 않은 사용 사례를, 나는 더 많은 코드를 필요 그렇게하기 위해서는 네비게이션을 멈추고 비동기 액션 후에 다시 시작하는 방법에 대한 아이디어가 필요합니다.

+0

안녕하세요, 고마워! 그것은 나에게 아이디어를 줬다, 내가 시험을 줘 보자! – linyuanxie

+0

콘솔에서 다음과 같은 오류가 발생했습니다. angular.js : 11706RangeError : 최대 호출 스택 크기를 초과했습니다. 방금 코드를 업데이트했습니다. – linyuanxie

+0

물론 무한 루프를 작성했기 때문에 오류가 발생합니다. '$ state.go'는 매번'$ stateChangeStart' 이벤트를 트리거 할 것이기 때문에 동일한 리스너를 계속해서 반복 실행합니다. isFirstTime이고 nextState.name이 'accountsetting.security'가 아닌 경우에만 'accountsetting.security'로 리디렉션해야합니다. – frankies

관련 문제