3

Я пытаюсь использовать Javascript-клиент Google API для использования входа в Google для своего приложения, а затем доступа к электронному адресу и контактам пользователя. Я сочетаю это с AngularJS, и я читал, что лучше всего сделать это своим Сервисом.Передача переменных из службы AngularJS контроллеру с помощью API Google?

Вот код для службы до сих пор:

.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, задокументировал 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; 
      }; 

     }]); 

И как это в настоящее время называется в контроллере:

var promise = googleLogin.login(); 
       promise.then(function (data) { 
        console.log(data.email); 
       }, function (reason) { 
        console.log('Failed: ' + reason); 
       }); 
+1

Это очень помогло мне, спасибо! – mortware

Смежные вопросы