3

我正在嘗試使用Google API Javascript客戶端在我的應用中使用Google登錄,然後訪問用戶的電子郵件地址和聯繫人。我將這與AngularJS結合起來,並且我已經讀過,最好把它做成自己的服務。使用Google API將AngularJS服務的變量傳遞給控制器​​?

這是迄今爲止該服務的代碼:

.service('googleLogin', ['$http', '$rootScope', function ($http, $rootScope) { 
      var clientId = '{MY CLIENT KEY}', 
       apiKey = '{MY API KEY}', 
       scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds', 
       domain = '{MY COMPANY DOMAIN}'; 

      this.handleClientLoad = function() { 
       // Step 2: Reference the API key 
       gapi.client.setApiKey(apiKey); 
       gapi.auth.init(function() { }); 
       window.setTimeout(checkAuth, 1); 
      }; 

      this.checkAuth = function() { 
       gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: true, hd: domain }, this.handleAuthResult); 
      }; 

      this.handleAuthResult = function(authResult) { 
       if (authResult && !authResult.error) { 
        gapi.client.load('oauth2', 'v2', function() { 
         var request = gapi.client.oauth2.userinfo.get(); 
         request.execute(function (resp) { 
          console.log(userEmail); 
         }); 
        }); 
       } 
      }; 

      this.handleAuthClick = function (event) { 
       // Step 3: get authorization to use private data 
       gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false, hd: domain }, this.handleAuthResult); 
       return false; 
      }; 

     }]); 

我再從控制器具有以下稱之爲:

 $scope.login = function() { 
      googleLogin.handleAuthClick(); 
     }; 

其中一期工程,以及API是否正確調用。但現在,我不確定如何通過服務從API獲取數據。我需要獲取用戶的電子郵件地址以及他們的聯繫人列表。我不能只有分開的get函數返回這些值,因爲它看起來像API客戶端調用必須以鍊形式進行(例如,handleAuthResult被稱爲handleAuthClick中的參數)。

我也嘗試將它們設置爲$rootScope的值,或者只是普通變量,但一旦控制器調用它們,它們總是以undefined的形式出現。

我是否正確接近?我怎樣才能將這些變量從Google API,服務,到控制器?謝謝。

+0

什麼是'handleClientLoad'方法呢?它看起來像是初始化例程。這是單身服務加載時自動調用嗎? –

+0

@JimG。我很久以前寫了這段代碼,它看起來好像是一個初始化例程,但它絕對不會在任何地方被調用。可能是多餘的/不必要的? – Jakemmarsh

回答

8

我最終使用了angularJS的promise/defer實現,記錄爲here

下面是最終服務:

.service('googleLogin', ['$http', '$rootScope', '$q', function ($http, $rootScope, $q) { 
      var clientId = '{MY CLIENT ID}', 
       apiKey = '{MY API KEY}', 
       scopes = 'https://www.googleapis.com/auth/userinfo.email https://www.google.com/m8/feeds', 
       domain = '{MY COMPANY DOMAIN}', 
       userEmail, 
       deferred = $q.defer(); 

      this.login = function() { 
       gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false, hd: domain }, this.handleAuthResult); 

       return deferred.promise; 
      } 

      this.handleClientLoad = function() { 
       gapi.client.setApiKey(apiKey); 
       gapi.auth.init(function() { }); 
       window.setTimeout(checkAuth, 1); 
      }; 

      this.checkAuth = function() { 
       gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: true, hd: domain }, this.handleAuthResult); 
      }; 

      this.handleAuthResult = function(authResult) { 
       if (authResult && !authResult.error) { 
        var data = {}; 
        gapi.client.load('oauth2', 'v2', function() { 
         var request = gapi.client.oauth2.userinfo.get(); 
         request.execute(function (resp) { 
          $rootScope.$apply(function() { 
           data.email = resp.email; 
          }); 
         }); 
        }); 
        deferred.resolve(data); 
       } else { 
        deferred.reject('error'); 
       } 
      }; 

      this.handleAuthClick = function (event) { 
       gapi.auth.authorize({ client_id: clientId, scope: scopes, immediate: false, hd: domain }, this.handleAuthResult); 
       return false; 
      }; 

     }]); 

以及它如何目前堪稱控制器:

​​
+1

這大大幫助了我,謝謝! – mortware

相關問題