2017-01-16 31 views
0

我運行阻滯如下:「應用程序*」角UI路由器過渡HookMatchCriteria不工作

angular.module('app', [...]).run(['$transitions', '$state', 'EmployeeService', ($transitions, $state, EmployeeService) => { 
    $transitions.onBefore(
     { to: 'app.*' }, 
     () => EmployeeService.checkAuth().then(() => { 
      console.log("run success"); 
     }, 
     () => { 
      console.log("run caught"); 
      return $state.target('login'); 
     }), 
     {priority: 10} 
    ); 
}]) 

,由於某種原因它執行的國家「應用」和「登錄」,雖然它們不匹配匹配標準,因此它在執行註銷時使我陷入無限循環。指定匹配條件的正確語法是什麼?我已經看了看這裏:
https://ui-router.github.io/ng1/docs/latest/interfaces/transition.hookmatchcriteria.html

編輯:發佈路由配置的要求 路線主模塊(包括未啓動時機的權威性檢查「應用程序」狀態):

export default mainPageRoutesConfig; 

function mainPageRoutesConfig($stateProvider, $urlRouterProvider, $locationProvider) { 
    "ngInject"; 
    $locationProvider.html5Mode(true).hashPrefix('!'); 
    $urlRouterProvider.otherwise('/'); 

    $stateProvider 
     .state('app', { 
      url: '/', 
      component: 'main' 
     }) 
     .state('app.timesheet', { 
      url: 'timesheet', 
      component: 'timesheet' 
     }) 
     .state('app.saveHours', { 
      url: 'saveTaskHours', 
      component: 'saveTaskHours', 
      params: { 
       timesheet:null 
      } 
     }) 
} 

爲員工模塊路由(包括未啓動時機的權威性檢查以及「登錄」狀態):

export default employeesRoutesConfig; 

function employeesRoutesConfig($stateProvider, $urlRouterProvider, $locationProvider) { 
    "ngInject"; 

    $locationProvider.html5Mode(true).hashPrefix('!'); 
    $urlRouterProvider.otherwise('/'); 

    $stateProvider 
     .state('login', { 
      url: 'login', 
      component: 'login' 
     }) 
     .state('app.employeesList', { 
      url: 'employees', 
      component: 'employeesList' 
     }) 
     .state('app.saveEmployee', { 
      url: 'employee/?Id', 
      component: 'saveEmployee' 
     }) 
     .state('app.deleteEmployee', { 
      url: 'employee/:Id', 
      component: 'deleteEmployee' 
     }) 
     .state('app.employeePage', { 
      url: 'profile/:Id', 
      component: 'employeePage' 
     }) 
} 
+0

請發表您的路線以及。 – 31piy

+0

>什麼是正確的語法來指定匹配標準? --- 您的語法看起來正確。我不知道這是否是一個錯誤。什麼版本的ui路由器? 1.0.0-RC.1? –

回答

1

解決方案(雖然不是一個真正的答案)爲指定比賽crite RIA的功能:

 { 
      to: function(state) { 
       return state.name !== 'app.login' && state.name !== 'app.error'; 
      } 
     } 

而且完整的代碼(移動到單獨的文件後):

export default ($transitions, $state, EmployeeService) => { 
    $transitions.onBefore(
     { 
      to: function(state) { 
       return state.name !== 'app.login' && state.name !== 'app.error'; 
      } 
     }, 
     () => EmployeeService.checkAuth().then(() => { 
      console.log("run block. Authorization check succeeded"); 
     }, 
     () => { 
      console.log("run block. Authorization check failed"); 
      return $state.target('app.login'); 
     }), 
     {priority: 10} 
    ); 
}])