Можно ли использовать Сервис в пределах $stateProvider
, для этой цели?AngularJS - обрабатывать маршруты до запуска приложения
У меня было много сообщений о стеке относительно маршрутизации, но большинство из них путают для новичков, поскольку каждый использует другой подход и относится к нему как к ракетной науке. Я хотел бы развивать хорошие привычки с самого начала и избегать плохих ...
Цель: выполнить некоторые функции перед запуском приложения и на основе этого выходного маршрута моего конечного пользователя.
То, что я пробовал:
Реализовать Услуги >>AuthService
| Действия >> простая проверка:
- Fetch JWT маркер от клиентской стороны (SQLite БД) - Токен содержит основные данные + API Key
- Отправить на сервер для аутентификации
- Response (Boolean)
- Если Авторизованный >> загрузить Home View. В противном случае переадресовываем регистр View.
- проверки на стороне сервера происходит перед загрузкой любого представления
Поставщики услуг
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
при обработке сеансов (также не в случае), но могут быть полезны для использования в будущем.
Спасибо. Приветствуется любая рекомендация о том, как и где обрабатывать этот сценарий.