我有一些页面包含facebook按钮的注册,我用[{1}}设置隐藏,并用ng-hide="fbLoggedIn"
隐藏的表格输入
如果ng-show="fbLoggedIn"
设置为true,我的目标是注册Facebook按钮将隐藏,如果fbLoggedIn
设置为true,则表单输入将显示。
注册facebook按钮fbLoggedIn
执行此功能
ng-click="registerFb()"
这是我的$scope.registerFB = function () {
authService.fbLogin();
$scope.fbLoggedIn = authService.fb_logged_in();
console.log($scope.fbLoggedIn); //this show false even `fb_access_token` not null
}
功能
authService.fbLogin and authService.fb_logged_in
在其他函数中,我尝试检查authService.fbLogin = function () {
var FB = window.FB;
FB.login(function(response) {
console.log(response);
if (response.authResponse) {
sessionService.set('fb_id', response.authResponse.userID);
sessionService.set('fb_access_token', response.authResponse.accessToken);
sessionService.set('fb_expiration_date', new Date(new Date().getTime() + response.authResponse.expiresIn * 1000).toISOString());
//console.log('Welcome! Fetching your information.... ');
FB.api('/me', function(response) {
console.log('Good to see you, ' + response.name + '.');
console.log(response);
});
} else {
console.log('User cancelled login or did not fully authorize.');
//console.log(response);
}
});
};
authService.fb_logged_in = function () {
if(sessionService.get('fb_access_token') != null){
return true;
}else {
return false;
}
};
是否为空,只是为了确定我的逻辑有问题,结果是fb_access_token
。
通过上面的调试,我可以说true
在$scope.fbLoggedIn = authService.fb_logged_in();
完成之前执行。
那么authService.fbLogin();
完成后如何执行$scope.fbLoggedIn = authService.fb_logged_in();
?也许如何实现我的目标?
答案 0 :(得分:2)
好的。这可以通过承诺来实现。我不知道您在autService服务中包含的参数,因此我将使用您可能需要添加的新参数创建一个同名的工厂。
因此,据我所知,这就是你的工厂应该如何。
angular.module('YourModuleName').factory('authService',['$http','$q',function($http,$q){
var obj = {};
obj.fbLogin = function () {
var defer = $q.defer();
var FB = window.FB;
FB.login(function(response) {
console.log(response);
if (response.authResponse) {
sessionService.set('fb_id', response.authResponse.userID);
sessionService.set('fb_access_token', response.authResponse.accessToken);
sessionService.set('fb_expiration_date', new Date(new Date().getTime() + response.authResponse.expiresIn * 1000).toISOString());
FB.api('/me', function(response) {
console.log(response);
defer.resolve('Good to see you, ' + response.name + '.');
});
}
else {
defer.reject('User cancelled login or did not fully authorize.');
}
});
return defer.promise;
}
obj.fb_logged_in = function () {
if(sessionService.get('fb_access_token') != null){
return true;
}else {
return false;
}
};
return obj;
}])
因此,来自控制器的函数调用应如下所示。
$scope.registerFB = function () {
authService.fbLogin().then(function(response){
$scope.fbLoggedIn = authService.fb_logged_in();
console.log($scope.fbLoggedIn);
},function(error){
console.error("Error : ",error);
});
}
Note: CODE NOT TESTED.
因此,它可以解决angularJS
的最佳实践问题答案 1 :(得分:0)
使用 $ rootscope 分配他们提供事件发布/广播和订阅设施的值。