2014-09-26 4 views
4

Можно ли использовать Сервис в пределах $stateProvider, для этой цели?AngularJS - обрабатывать маршруты до запуска приложения

У меня было много сообщений о стеке относительно маршрутизации, но большинство из них путают для новичков, поскольку каждый использует другой подход и относится к нему как к ракетной науке. Я хотел бы развивать хорошие привычки с самого начала и избегать плохих ...

Цель: выполнить некоторые функции перед запуском приложения и на основе этого выходного маршрута моего конечного пользователя.

То, что я пробовал:

Реализовать Услуги >>AuthService | Действия >> простая проверка:

  1. Fetch JWT маркер от клиентской стороны (SQLite БД) - Токен содержит основные данные + API Key
  2. Отправить на сервер для аутентификации
  3. Response (Boolean)
  4. Если Авторизованный >> загрузить Home View. В противном случае переадресовываем регистр View.
  5. проверки на стороне сервера происходит перед загрузкой любого представления

Поставщики услуг

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; 
}); 

Конфигурация маршрута

Это часть я борюсь с. Где и как вводить эту услугу? Я получил его работу, но я не уверен, что это правильный способ справиться с этим.

  • Вызовите Сервис в Resolve собственности $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; 
     }] 
    }) 
}); 

Является ли это подходящее место для запуска такой проверки подлинности?

Это простая демонстрация Hello World, которая поможет мне начать работу с Angular. У меня нет навигации (несколько просмотров), поэтому проверка должна быть прямой.

Я видел много примеров, используя locationChangeStart для запуска службы перед загрузкой представления. Затем используются $scope.watch и $broadcast при обработке сеансов (также не в случае), но могут быть полезны для использования в будущем.

Спасибо. Приветствуется любая рекомендация о том, как и где обрабатывать этот сценарий.

ответ

0

Это на самом деле то, что я должен был делать. Вы можете использовать resolve для каждого из состояний.

В приведенном ниже коде у меня есть функция resolUserAuth, которая вернет объект пользователя.

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; 
    }; 
Смежные вопросы