2016-06-29 71 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返回true,我會做一些設置安全控制器,還需要禁用所有其他路由器,如報告,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

相關問題