2016-11-20 16 views
0

私はng-hide="fbLoggedIn"に隠されたセットのFacebookのボタンに登録し、真のフォーム入力にfbLoggedInセットが表示されます場合、私は私の目標は、Facebookのボタンに登録されng-show="fbLoggedIn"AngularJS関数の終了後に関数を実行する方法は?

に隠された設定の入力が非表示になります形成含まれているいくつかのページを持っていますfbLoggedInがtrueに設定されている場合

レジスタFacebookのボタン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がちょうどと間違っ必ず何か作るために、nullでないかどうかをチェックしてみてください私の論理は、結果はtrueです。

上記のデバッグを使用すると、はauthService.fbLogin();より前に実行されます。

だから私は authService.fbLogin();の後に実行することができますか?多分私の目標を達成する方法?

+0

のベストプラクティスの問題を解決するだろう。 return inと同様に、defer.resolve()を呼び出すと、defer = $ qとなります。タスクを実行するには、the.then()メソッドの最初のパラメータを使用します。 –

+0

@TirthrajBarotあなたはいくつかのコード例で答えたいですか?多分私のコードで? –

+0

そして、$ rootScopeを使ってもできると思います...ログイン機能で$ rootScope.fb_isLogin = trueを設定し、このrootScope変数をng-hideに入れてください –

答えて

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

0

$ rootscopeを使用して、イベント放出/ブロードキャストおよびサブスクリプション機能を提供する値を割り当てます。

関連する問題