Statt die Singletons für die GoogleAuth Bibliothek des Abrufens und den Client in meiner Anmeldeseite Controller einrichten, hatte ich es in der Datei index.html zu initialisieren:
<script src="https://apis.google.com/js/api:client.js?onload=start" async defer></script>
<script>
function start() {
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'myAppID',
cookiepolicy: 'single_host_origin'
});
});
}
</script>
, dass das Abmelde Problem gelöst . Wenn die Anmeldeseite jedoch aktualisiert wurde, wurde die Steuerungslogik ausgeführt, bevor gapi.auth2
definiert wurde und der Click-Handler nicht erfolgreich an die Anmeldeschaltfläche angefügt werden konnte.
Um das zu vermeiden - wenn auch nicht eine elegante Lösung zu sein -, ich $interval verwendet zu warten, bis gapi.auth2
wurde initialisiert:
waitForAuth2Initialization = $interval(function() {
console.log("Checking...");
if (!gapi.auth2)
return;
console.log("Ok, gapi.auth2 is not undefined anymore");
var auth2 = gapi.auth2.getAuthInstance();
// Attach signin
auth2.attachClickHandler...
$interval.cancel(waitForAuth2Initialization);
}, 50);
EDIT: eine weitere mögliche Lösung ist es, ein Versprechen zu verwenden Rückruf für die Controller-Logik, um zu warten, bis das Versprechen gelöst ist, dh bis Google API vollständig geladen ist und gapi.auth2
bereit ist zu verwenden. Es ist posible das zu erreichen, indem Sie:
<script src="https://apis.google.com/js/api:client.js?onload=start" async defer></script>
<script>
gapiPromise = (function() {
var deferred = $.Deferred();
window.start = function() {
deferred.resolve(gapi);
};
return deferred.promise();
}());
auth2Promise = gapiPromise.then(function() {
var deferred = $.Deferred();
gapi.load('auth2', function() {
auth2 = gapi.auth2.init({
client_id: 'myAppID',
cookiepolicy: 'single_host_origin'
}).then(function() {
deferred.resolve(gapi.auth2);
});
});
return deferred.promise();
});
</script>
Und dann in der Steuerung:
auth2Promise.then(function() {
console.log("Ok, gapi.auth2 is not undefined anymore");
var auth2 = gapi.auth2.getAuthInstance();
// Attach signin
auth2.attachClickHandler...
});
Aber der Nachteil dieses Ansatzes ist, dass es langsamer ist (doppelt so viel Zeit für die Einnahme Click-Handler zum Anhängen) als der erste, der $interval
verwendet.
ähnliche Frage: [? Wie eine Anwendung Abmelden Wo ich OAuth2 Verwendet mit Google anmelden] (http://stackoverflow.com/questions/12909332/how-to-logout-of-an-application-where-i-used-oauth2-to-login-with-google) – Roberto