Google Sign-In for Websites and Angular 2 using Typescript
For your first problem solution is to use arrow function which will preserve context of this
:
onGoogleLoginSuccess = (loggedInUser) => {
this.userAuthToken = loggedInUser.getAuthResponse().id_token;
this.userDisplayName = loggedInUser.getBasicProfile().getName();
console.log(this);
}
Second issue is happening because third-party scripts run outside the context of Angular. Angular uses zones
so when you run something, for example setTimeout()
, which is monkey-patched to run in the zone, Angular will get notified. You would run jQuery in zone like this:
constructor(private zone: NgZone) {
this.zone.run(() => {
$.proxy(this.onGoogleLoginSuccess, this);
});
}
There are many questions/answers about the zone with much better explanations then mine, if you want to know more, but it shouldn't be an issue for your example if you use arrow function.
I made a google-login component if you want an example.
ngOnInit()
{
this.initAPI = new Promise(
(resolve) => {
window['onLoadGoogleAPI'] =
() => {
resolve(window.gapi);
};
this.init();
}
)
}
init(){
let meta = document.createElement('meta');
meta.name = 'google-signin-client_id';
meta.content = 'xxxxx-xxxxxx.apps.googleusercontent.com';
document.getElementsByTagName('head')[0].appendChild(meta);
let node = document.createElement('script');
node.src = 'https://apis.google.com/js/platform.js?onload=onLoadGoogleAPI';
node.type = 'text/javascript';
document.getElementsByTagName('body')[0].appendChild(node);
}
ngAfterViewInit() {
this.initAPI.then(
(gapi) => {
gapi.load('auth2', () =>
{
var auth2 = gapi.auth2.init({
client_id: 'xxxxx-xxxxxx.apps.googleusercontent.com',
cookiepolicy: 'single_host_origin',
scope: 'profile email'
});
auth2.attachClickHandler(document.getElementById('googleSignInButton'), {},
this.onSuccess,
this.onFailure
);
});
}
)
}
onSuccess = (user) => {
this._ngZone.run(
() => {
if(user.getAuthResponse().scope ) {
//Store the token in the db
this.socialService.googleLogIn(user.getAuthResponse().id_token)
} else {
this.loadingService.displayLoadingSpinner(false);
}
}
);
};
onFailure = (error) => {
this.loadingService.displayLoadingSpinner(false);
this.messageService.setDisplayAlert("error", error);
this._ngZone.run(() => {
//display spinner
this.loadingService.displayLoadingSpinner(false);
});
}
It's a bit late but I just want to give an example if someone want to use google login api with ng2.