I am using facebook sdk like below
FacebookService.ts modified from https://github.com/zyramedia/ng2-facebook-sdk. FacebookService file is partial, not pasting full file
analyze appendFacebook method to load external scripts globally but we are invoking when component requires, once external script loaded then we won't load it again as we are checking script id
@Injectable()
export class FacebookService {
/**
* This method is used to initialize and setup the SDK.
* @param params
*/
init(params: FacebookInitParams): Observable<any> {
return new Observable(observer => {
if (!window['fbAsyncInit']) {
this.appendFacebook();
window['fbAsyncInit'] = function() {
FB.init(params);
observer.next('FB initialized');
observer.complete();
};
} else {
observer.next('FB initialized');
observer.complete();
}
});
}
appendFacebook() {
var js,
id = 'facebook-jssdk',
ref = document.getElementsByTagName('script')[0];
if (document.getElementById(id)) {
return;
}
js = document.createElement('script');
js.id = id;
js.async = true;
js.src = "//connect.facebook.net/en_US/sdk.js";
ref.parentNode.insertBefore(js, ref);
}
}
then in component.ts file
constructor(private facebookService: FacebookService) {}
loginByFacebook() {
let facebookParams: FacebookInitParams = {
appId: environment.facebookAppId,
xfbml: true,
version: 'v2.7'
};
let facebookSubscription = this.facebookService.init(facebookParams).mergeMap(data => {
return this.facebookService.login({scope: "public_profile,user_friends,email"});
}).subscribe((response: FacebookLoginResponse) => {
console.log(response);
}, error => {
console.log(error);
});
}