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

Posted

技术标签:

【中文标题】如果用户已经登录 ionic,如何跳过登录页面【英文标题】:how to skip login page if user already logged in in ionic 【发布时间】:2016-08-07 08:20:44 【问题描述】:

您好,我是 ionic 框架的新手。我在 ionic 中使用会话管理器。但是如果用户已经登录,我想跳过登录页面。

app.js

angular.module('grocery', ['ionic', 'grocery.controller', 'ngCordova', 'ngCordovaOauth'])

.run(function($ionicPlatform, $cordovaSQLite, $cordovaToast, $rootScope, mainItemsList, $state) 
    $ionicPlatform.ready(function() 
        if (window.cordova && window.cordova.plugins.Keyboard) 

            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);

            stops the viewport
            // from snapping when text inputs are focused. Ionic handles this internally for
            // a much nicer keyboard experience.
            cordova.plugins.Keyboard.disableScroll(true);
        
        if (window.StatusBar) 
            StatusBar.styleDefault();
        

    );


);


$rootScope.$on('$locationChangeStart', function(event, newUrl, oldUrl) 
    if (mainItemsList.isLoggedIn() != true) 
        $state.go('app.login');
    



)


.config(function($stateProvider, $urlRouterProvider) 

    $stateProvider
        .state('app', 
            url: "/app",
            abstract: true,
            templateUrl: "templates/navigationDrawer.html",
            controller: 'AppCtrl'
        )

    .state('app.masterList', 
        url: "/masterList",
        views: 
            'menuContent': 
                templateUrl: "templates/masterList.html",
                controller: 'indexCtrl'
            
        
    )


    .state('app.login', 
        url: "/login",
        views: 
            'menuContent': 
                templateUrl: "templates/login.html",
                controller: 'loginCtrl'
            
        
    )

    .state('app.register', 
        url: "/register",
        views: 
            'menuContent': 
                templateUrl: "templates/register.html",
                controller: 'registerCtrl'
            
        
    )


    $urlRouterProvider.otherwise("/app/masterList");


);


angular.module('grocery.services', [])
    .factory('mainItemsList', function($cordovaSQLite, $cordovaToast, $cordovaPreferences) 
        return 
            isLoggedIn: function(sessionEmail) 

                $cordovaPreferences.store('email', sessionEmail).success(function(value) 
                        //$cordovaToast.showShortTop('stored');
                    )
                    .error(function(error) 
                        $cordovaToast.showShortTop("Error " + error);
                    )


                return true;
            


        
    )

我尝试了现有的 *** 答案。但不工作。请帮助我哪里错了。

【问题讨论】:

我猜在 'app.login' 状态下使用 'resolve' 属性就可以了 【参考方案1】:

创建一个新控制器和一个名为autologin 的新状态。将此设置为您的默认状态。在autologin 控制器中,检查用户是否已经登录。如果是,则重定向到某个页面。如果他不是,请重定向到登录。

  .state('app.autologin', 
    url: "/autologin",
    controller: 'autologinCtrl'
  )

$urlRouterProvider.otherwise("/app/autologin");

控制器:

angular.module('grocery').controller('autologinCtrl, function($scope, $state)
    //check if user is logged in
    if (userLoggedIn)
        state.go('app.masterList');
     else 
        state.go('app.login');
    
);

【讨论】:

你还需要去掉 $rootScope.$on('$locationChangeStart'... 因为它会干扰【参考方案2】:

如果你为这个逻辑添加一个新的controller,页面之间会有闪烁的机会。所以使用$urlRouterProvider处理这个问题

.config(function($stateProvider, $urlRouterProvider, mainItemsList) 
    $stateProvider
        .state('app', 
            url: "/app",
            abstract: true,
            templateUrl: "templates/navigationDrawer.html",
            controller: 'AppCtrl'
        )

    .state('app.masterList', 
            url: "/masterList",
            views: 
                'menuContent': 
                    templateUrl: "templates/masterList.html",
                    controller: 'indexCtrl'
                
            
        )
        .state('app.login', 
            url: "/login",
            views: 
                'menuContent': 
                    templateUrl: "templates/login.html",
                    controller: 'loginCtrl'
                
            
        )

    .state('app.register', 
        url: "/register",
        views: 
            'menuContent': 
                templateUrl: "templates/register.html",
                controller: 'registerCtrl'
            
        
    );
    // if none of the above states are matched, use this as the fallback
    $urlRouterProvider.otherwise(function() 
        var logged = mainItemsList.isLoggedIn();
        // Check User logined or not
        if (logged != true) 
            return 'app.login';
         else 
            return 'app.masterList';
        

    );


);

【讨论】:

以上是关于如果用户已经登录 ionic,如何跳过登录页面的主要内容,如果未能解决你的问题,请参考以下文章

在用户已登录 Facebook 的设备上登录时如何跳过 Facebook 的权限页面

Ionic 3 登录后刷新侧边菜单

使用 Ionic 2,您如何通过登录后将您发送到另一个页面的模式来更改基于登录状态的按钮?

如何自动检测已登录的用户并将其转至仪表板页面,而无需再在Ionic 4和firebase中登录

WebAuthenticator 总是跳过登录页面,如何为新用户获取新的登录表单?

如何在 ionic 1 混合应用程序中自动登录用户?