AngularJS一些函数完成后如何执行函数?

时间:2016-11-20 10:19:48

标签: angularjs

我有一些页面包含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();?也许如何实现我的目标?

2 个答案:

答案 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 分配他们提供事件发布/广播和订阅设施的值。