我尝试在第三方登录后将用户重定向到信息中心。但是当成功回调被触发时,应用程序仍然在登录页面上,没有任何反应。如果我刷新浏览器,我的拦截器捕获已登录并更改为仪表板...我的登录控制器如下所示:
ThirdParty.login(function(result){
callbackSUCCESS(result);
},function(){});
function callbackSUCCESS(result){
AuthenticationService.login(result).then(
callbackServerSUCCESS(), function(reject) {
callbackServerERROR(reject);
});
}
function callbackServerSUCCESS() {
$scope.$apply(function() {
$state.go('dashboard');
});
}
我在app.js中的路线
$stateProvider
.state('dashboard', {
url: '/dashboard',
views: {
'': {
templateUrl: 'views/dashboard/dashboard.html',
controller: 'DashboardCtrl'
}
}
});
我的标头控制器
.controller('HeaderCtrl', ['$scope', 'AuthenticationService', '$state',
function($scope, AuthenticationService, $state) {
$scope.logout = function() {
AuthenticationService.logout().then(callbackServer(), callbackServer());
};
function callbackServer() {
$state.go('login');
}
}
]);
身份验证控制器Angular Factory
var headersConfig = {
'Cache-Control': 'no-cache',
'Pragma': 'no-cache'
};
return {
login: function(credentials) {
var deferred = $q.defer();
$http.post('/api/users/sign_in', sanitizeCredentials(credentials), {
headers: headersConfig,
timeout: deferred.promise
}).then(function(result) {
if (result.status === 200) {
UserSessionService.cacheSession(result.data);
deferred.resolve();
} else {
deferred.reject();
}
}, function(reject) {
UserSessionService.clean();
deferred.reject(reject);
});
$timeout(function() {
deferred.resolve();
}, 15000);
return deferred.promise;
}
};
答案 0 :(得分:1)
我无法记住$state.go
的确切语义,但通常在响应Angular无法识别的事件时需要以某种方式使用$scope.$apply
,以确保消化循环发生。即你可以尝试:
ThirdParty.login(function(result) {
$scope.$apply(function() {
$state.go('dashboard');
});
}, function() {});
你需要从某个地方获得对范围的引用,但是在Angular应用程序中找不到一个范围。
答案 1 :(得分:0)
摆脱
中的()
then(callbackServer(), callbackServer())