【问题标题】:Ionic $location.path() works in browser but not on devicesIonic $location.path() 在浏览器中有效,但在设备上无效
【发布时间】:2015-08-11 03:10:59
【问题描述】:

所以,我有以下代码,它们都可以在浏览器中运行,但由于某种原因,我不断将我重定向回实际的 Android 设备上登录。

controllers.js

App.controller('LoginController', ['$scope', 'RequestService', '$location', 'OpenFB', '$rootScope', function($scope, RequestService, $location, OpenFB, $rootScope) {

    $scope.provider = '';

    $scope.loginFacebook = function() {

        $scope.provider = 'facebook';

        OpenFB.login('email, user_friends').then(
            function () {
                OpenFB.get('/me').success(function (user) {
                    localStorage.setItem('fbuser', JSON.stringify(user));
                });

                localStorage.setItem('provider', 'facebook');

                RequestService.get($scope.baseUrl + 'user')
                    .success(function(data, status, headers, config){

                        $scope.user = data;

                        //Set our logged in var
                        localStorage.setItem('loggedIn', true);

                        // Check if the user has accepted EULA
                        if($scope.user.eula == 0) {
                            $location.path('/eula');
                        }
                        else
                        {
                            //TODO:Redirect to the users dashboard, when we have the routes.
                            console.log('EULA Accepted, Redirect somewhere else!');
                        }

                    });
            },
            function (error) {
                localStorage.removeItem('loggedIn');
            });
    };

}]);

我已经调试了上述内容,一切正常,一旦 FB 登录,它会查询数据库,使用从 Facebook 抓取的数据设置用户,然后检查该数据以查看 EULA 是否已被接受.如果不是那么应该重定向到$location.path('/eula');

路线

.config(function($httpProvider, $stateProvider, $urlRouterProvider) {

    $httpProvider.interceptors.push('httpRequestInterceptor');

    $urlRouterProvider.otherwise('/');

    $stateProvider

    .state('login', {
        url: '/',
        templateUrl: 'templates/login.html',
        data: {
            requireLogin: false
        }
    })

    .state('eula', {
        url: '/eula',
        templateUrl: 'templates/eula.html',
        data: {
            requireLogin: true
        }
    })

        .state('accept', {
            url: '/accept',
            templateUrl: 'templates/accept.html',
            data: {
                requireLogin: true
            }
        })
});

【问题讨论】:

    标签: android angularjs angular-ui-router ionic-framework


    【解决方案1】:

    当您使用 ui-router(离子标准)时,您应该使用状态。

    替换:$location.path('/eula');$state.go('eula'); (以及对应注入的依赖项)

    【讨论】:

    • 是的,我实际上只是尝试过,但我似乎遇到了同样的问题:/
    • 您有什么问题吗?您可以添加登录以确认您确实处于这种状态吗? if($scope.user.eula == 0) { alert("转到状态");$stage.go('eula'); }
    【解决方案2】:

    您的问题似乎与执行有关。
    OpenFB 没有实现承诺。

    看看这些行:

    OpenFB.get('/me').success(function (user) {
        localStorage.setItem('fbuser', JSON.stringify(user));
    });
    
    localStorage.setItem('provider', 'facebook');
    

    OpenFB.get 返回结果可能需要一段时间,但您的代码无论如何都会执行以下指令,因此您可能会发现自己处于调用的情况:

    RequestService.get($scope.baseUrl + 'user')
    

    OpenFB.get('/me') 完成执行之前。

    最好的解决方案是使用实现承诺的ngOpenFB$q承诺。
    有一个样本here

    你的代码应该这样实现:

    ngFB.login({scope: 'email, user_friends'})
        .then(function(response){
            // response.authResponse.accessToken
            return ngFB.api({path: '/me'});
        })
        .then(function(user){
            localStorage.setItem('fbuser', JSON.stringify(user));
            localStorage.setItem('provider', 'facebook');
            RequestService.get($scope.baseUrl + 'user')
                .success(function(data, status, headers, config){
                    $scope.user = data;
    
                    //Set our logged in var
                    localStorage.setItem('loggedIn', true);
    
                    // Check if the user has accepted EULA
                    if($scope.user.eula == 0) {
                        return false;
                    } else
                    {
                        return true;
                    }
                })
                .error(function (data, status, headers, config) {
                    return false;
                })
        })
        .then(function(eulaAccepted){
            if (eulaAccepted)
            {
                $state.go('eula');
            }
        })
        catch(function(reason){
            localStorage.removeItem('loggedIn');
        });
    

    每个调用都会返回一个 promise,并且它们可以嵌套。第二个.then( 获得第二个承诺的结果(当它被解决时)ngFB.api({path: '/me'})
    由于该调用返回对象用户的承诺,因此您将能够在函数中读取它。

    这段代码:

    if($scope.user.eula == 0) {
         return false;
    } else
    {
        return true;
    }
    

    不返回一个承诺,但这种类型的语法是可以的。

    在第三个.then(

    .then(function(eulaAccepted){
        if (eulaAccepted)
        {
            $state.go('eula');
        }
    })
    

    您将能够读取上一条语句 (eula) 的值。

    请注意,我没有测试过这段代码,因为我没有 facebook,但 Promise 的优点是可以避免无限级别的嵌套代码

    【讨论】:

      【解决方案3】:

      好的,问题解决了,在我的应用程序的 .run() 方法的登录检查中,我错过了放置 'event.preventDefault();'调用,一旦移动了桌面浏览器和我的设备上的作品。

      【讨论】:

      • 它搬到了哪里?
      猜你喜欢
      • 1970-01-01
      • 2016-12-10
      • 2015-08-25
      • 2021-05-25
      • 2015-08-28
      • 2019-09-08
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多