Ionic $ location.path()在浏览器中工作,但在设备上不工作

时间:2015-05-28 14:27:40

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

所以,我有以下代码,这些代码都可以在浏览器中运行,但出于某种原因,我仍然会将我重新定向回到实际的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
            }
        })
});

3 个答案:

答案 0 :(得分:1)

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

替换$location.path('/eula'); $state.go('eula'); (并对应注入依赖)

答案 1 :(得分:0)

你的问题似乎与执行有关 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,但承诺的优点是避免无限级别的嵌套代码

答案 2 :(得分:0)

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