Как пропустить страницу входа, если пользователь уже зарегистрирован в ионной структуре

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

app.js

$rootScope.$on("$locationChangeStart", function (event, next, current) {
    var prefs = plugins.appPreferences;
    prefs.fetch('iuserid').then(function (value) {
        if (value != '') {
            $state.go('app.dashboard');
        }
    });
.config(function ($stateProvider, $urlRouterProvider, $httpProvider) {
    $stateProvider
        .state('app', {
            url: "/app",
            abstract: true,
            templateUrl: "templates/menu.html",
            controller: 'AppCtrl'
        })
        .state('login', {
            url: "/login",
            templateUrl: "templates/login.html",
            controller: 'LoginCtrl'
        })
        .state('app.dashboard', {
            url: "/dashboard",
            views: {
                'menuContent': {
                    templateUrl: "templates/dashboard.html",
                    controller: 'DashboardCtrl'
                }
            }
        })
        ;
    // if none of the above states are matched, use this as the fallback
    $urlRouterProvider.otherwise('/login');
    });
});

Я не знаю, где я ошибаюсь.

Изменить: Я могу выполнить аутентификацию и перенаправление на панель управления, но моя проблема - это страница входа в систему, отображаемая на несколько (до 2) секунд, а затем перенаправление на панель управления, и я работаю над IONIC

Второе редактирование Я нашел проблему, но не знаю решения. Предпочтение сильно зависит от $ionicPlatform.ready, но не работает в $locationChangeStart. И мне нужно предпочтение в $locationChangeStart, потому что оно работает до $ionicPlatformReady. Мне отчаянно нужно решение.

Ответы

Ответ 1

Я делаю следующее:

в app.js

.state('login', {
    url: "/login",
    templateUrl     : "templates/session/login.html",
    controller      : 'SessionCtrl'
  })

  .state('register', {
    url: "/register",
    templateUrl     : "templates/session/register.html",
    controller      : 'SessionCtrl'
  })
  .state('app', {
    url: "/app",
    abstract: true,
    templateUrl     : "templates/menu.html",
    controller      : 'AppCtrl',
    onEnter: function($state, Auth){
        if(!Auth.isLoggedIn()){
           $state.go('login');
        }
    }
  })
  .state('app.main', {
    url: "/main",
    views: {
      'menuContent': {
        templateUrl   : "templates/main_menu.html",
        controller    : "MainMenuCtrl"
      }
    }
  })

  $urlRouterProvider.otherwise('/app/main');

Auth - это factory, он хранит сеанс аутентификации в локальном хранилище.

angular.module('auth.services', [])
.factory('Auth', function () {
   if (window.localStorage['session']) {
      var _user = JSON.parse(window.localStorage['session']);
   }
   var setUser = function (session) {
      _user = session;
      window.localStorage['session'] = JSON.stringify(_user);
   }

   return {
      setUser: setUser,
      isLoggedIn: function () {
         return _user ? true : false;
      },
      getUser: function () {
         return _user;
      },
      logout: function () {
         window.localStorage.removeItem("session");
         window.localStorage.removeItem("list_dependents");
         _user = null;
      }
   }
});

Ответ 2

Я думаю, что вы должны прослушать событие $stateChangeStart в $rootScope, вы можете прослушать это событие во время выполнения, например:

angular.module("myapp.permission").run($rootScope){
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
        var loggedIn = true;
        if(loggedIn) {
            $state.go('app.dashboard');
        }
    }
}

Ответ 3

Ребята попробуют это элегантное решение:

  • если пользователь не вошел в систему, а для входа в систему требуется его перенаправление для входа в систему.

  • если пользователь попытается войти в систему, и он уже вошел в систему, чтобы он этого не делал.

  • отметьте каждый путь как "requireAuth", и он будет работать.

  • поместите свой код в app.js

    .run(function ($rootScope, $location, authService) {
        $rootScope.$on('$stateChangeStart', function (ev, to, toParams, from, fromParams) {
            if (to.requireAuth && !authService.isAuthed()) {
                $location.path("/login");
            }
            else if (to.name == 'login' && authService.isAuthed()) {
                ev.preventDefault();
                $location.path("/dashboard");
            }
        });
    })
    

Ответ 4

Удалите

$urlRouterProvider.otherwise('/loginpage')

внизу файла routes.js.

Ответ 5

Внутри блока "run" и вне $ionicPlatform.ready вы можете использовать это:

    //Check if user loggedin and redirect to login page if not

$rootScope.$on('$stateChangeStart', function (event, toState) { 

    //Check only if you are not in login page              
    if(toState.name.indexOf('app') !== -1 ) {

      // If user is not logged, will redirect to login page, eg:
      var prefs = plugins.appPreferences;
      prefs.fetch('iuserid').then(function (value) {
         if (value != '') {
            $state.go('login');
         }
      });
    }                         

});  

После того, как вы должны изменить:

$urlRouterProvider.otherwise('/login');

для этого:

$urlRouterProvider.otherwise('/dashboard');

Идея - это прямой маршрут к панели управления, и если она не вошла в систему, она будет перенаправлена ​​на страницу входа.