所以,我有以下代码,这些代码都可以在浏览器中运行,但出于某种原因,我仍然会将我重新定向回到实际的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
}
})
});
答案 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();'电话,一旦移动了桌面浏览器和我的设备上的工作。