我正在使用 facebook sdk,如下所示
FacebookService.ts 修改自 https://github.com/zyramedia/ng2-facebook-sdk。 FacebookService 文件是部分文件,未粘贴完整文件
分析 appendFacebook 方法以全局加载外部脚本,但我们在组件需要时调用,一旦外部脚本加载,我们将不会再次加载它,因为我们正在检查脚本 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);
}
}
然后在component.ts文件中
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);
});
}