不是檢索單身的GoogleAuth庫,並在我的登錄頁面控制器設置客戶端的,我曾在index.html文件來初始化它:
<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>
這解決了這個問題,註銷。但是,如果登錄頁面已刷新,其控制器邏輯將在定義gapi.auth2
之前執行,並且將點擊處理程序成功附加到登錄按鈕將不可行。
爲了避免 - 雖然不是一個完美的解決方案 - 我用$interval等到gapi.auth2
被初始化:
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);
編輯:另一種可能的解決方案是使用一個承諾控制器邏輯回調等待,直到承諾解決,即在Google API完全加載並且gapi.auth2
可以使用之前。 它是更多鈔票做以實現:
<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>
然後在控制器:
auth2Promise.then(function() {
console.log("Ok, gapi.auth2 is not undefined anymore");
var auth2 = gapi.auth2.getAuthInstance();
// Attach signin
auth2.attachClickHandler...
});
但是,這種方法的缺點是,它是比較慢(考慮了兩倍的時間點擊處理程序被附加)比第一個使用$interval
。
類似的問題:[?如何註銷一個應用程序,我使用的OAuth2到登錄隨着谷歌的] (http://stackoverflow.com/questions/12909332/how-to-logout-of-an-application-where-i-used-oauth2-to-login-with-google) – Roberto