Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如果用户已经登录到ionic framework,如何跳过登录页面_Angularjs_Ionic Framework - Fatal编程技术网

Angularjs 如果用户已经登录到ionic framework,如何跳过登录页面

Angularjs 如果用户已经登录到ionic framework,如何跳过登录页面,angularjs,ionic-framework,Angularjs,Ionic Framework,我正在开发一个爱奥尼亚应用程序,我已经检查了用户是否已经登录,如果用户已经登录,那么应用程序应该在仪表板上重定向。此功能运行良好,但应用程序首先显示登录页面几秒钟,然后重定向到仪表板 app.js $rootScope.$on("$locationChangeStart", function (event, next, current) { var prefs = plugins.appPreferences; prefs.fetch('iuserid').then(functi

我正在开发一个爱奥尼亚应用程序,我已经检查了用户是否已经登录,如果用户已经登录,那么应用程序应该在仪表板上重定向。此功能运行良好,但应用程序首先显示登录页面几秒钟,然后重定向到仪表板

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秒钟),然后重定向到仪表板,我正在使用爱奥尼亚应用程序

第二次编辑
我发现了问题,但不知道解决办法。首选项在$ionicPlatform.ready中非常有效,但在$locationChangeStart中不起作用。我需要$locationChangeStart中的首选项,因为它在$ionicPlatformReady之前运行。我迫切需要解决办法

我认为您应该在
$rootScope
上收听事件
$stateChangeStart
,您可以在运行时收听此事件,如下所示:

angular.module("myapp.permission").run($rootScope){
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
        var loggedIn = true;
        if(loggedIn) {
            $state.go('app.dashboard');
        }
    }
}
在“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');
想法是直接路由到仪表板,如果未登录,将重定向到登录页面。

我执行以下操作:

在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是一个工厂,它将Auth会话存储在localstorage中

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

伙计们试试这个优雅的解决方案:

  • 如果用户未登录且需要登录,则会重定向到登录

  • 如果用户试图登录,但他已经登录,请阻止他登录

  • 将每条路径标记为“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");
            }
        });
    })
    
  • 除去

    $urlRouterProvider.otherwise('/loginpage')
    

    在routes.js文件的底部。

    使用app.run@kalpeshpatel,我已经试过了。它在app中生成错误“plugins is not defined”(插件未定义)。可能重复@jackyrudetsky请查看我的editmark,如果它面临相同的问题,但仍然无法工作,请查看我的editmark。abobe getin error AuthData not defined worked完美,Best answerAuth.isLoggedIn()始终返回false。如何将用户登录状态设置为true。你能更具体地回答这个问题吗?在我使用上述建议的解决方案解决以下问题时,是否还有其他解决方案:。这个问题还有其他解决方案吗?是
    auth.services
    是默认模块还是我们可以定义它?我认为这并不能避免看到一页1秒,run方法将在config方法之后运行,因此延迟仍然存在。是否有任何解决方案可以在配置运行之前运行