Angular 2アプリケーションでGoogle API Javascriptライブラリを使用しています。私はコンポーネントで注入されるサービスを作成しました。ここでは、コードは次のようになります。Angular 2サービスとしてJavascriptクライアントライブラリを使用しているGoogle APIエンドポイント
import { Injectable } from '@angular/core';
const url = 'https://apis.google.com/js/client.js?onload=__onGoogleLoaded';
@Injectable()
export class GoogleAPIService {
public client: any;
public calculatorService: any;
public actionService: any;
loadAPI: Promise<any>
constructor(){
this.loadAPI = new Promise((resolve) => {
window['__onGoogleLoaded'] = (ev) => {
console.log('gapi loaded');
resolve(window['gapi']);
this.client = window['gapi'].client;
this.loadEndPoints('{Endpoint URL}/_ah/api');
}
this.loadScript();
});
}
doSomethingGoogley(){
return this.loadAPI.then((gapi) => {
console.log(gapi);
});
}
loadScript(){
console.log('loading..')
let node = document.createElement('script');
node.src = url;
node.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(node);
}
loadEndPoints(apiRoot) {
// Loads the OAuth and calculatorendpoint APIs asynchronously, and triggers login
// when they have completed.
var apisToLoad;
var callback = function() {
console.log('API Loaded '+apisToLoad);
if (--apisToLoad == 0) {
//this.endpoint1= this.client.endpoint1; //Doesn't Work
//this.endpoint2= this.client.endpoint2;
}
}
apisToLoad = 3; // must match number of calls to gapi.client.load()
this.client.load('oauth2', 'v2', callback);
this.client.load('endpoint1', 'v1', callback, apiRoot);
this.client.load('endpoint2','v1',callback,apiRoot);
}
}
私は3つの質問を持っている:
- にはどうすればいいのエンドポイントがサービスにパブリック変数としてgapi.client.endpoint1得るのですか?
- APIのメソッドを呼び出すにはどうすればよいですか? JavaScriptを使用すると、gapi.client.endpoint1.method()を呼び出すことができます。execute()
- このサービスをシングルトンにするにはどうすればよいですか?
何か助けていただければ幸いです。
EDIT:
ここでは、サービスの作業バージョンです。私は自分のルートモジュールでプロバイダとして使用します。したがって、アプリケーション全体でシングルトンとして利用できます。
import { Injectable } from '@angular/core';
const url = 'https://apis.google.com/js/client.js?onload=__onGoogleLoaded';
const gapiOnLoaded = '__onGoogleLoaded';
const clientName = 'gapi';
const endpointhost = '[HTTPS URL FOR ENDPOINTS]';
const apiEndPoint = endpointhost + '/_ah/api';
@Injectable()
export class GoogleAPIService {
private gapi: any;
private loadAPI: Promise<any>;
constructor() {
this.loadAPI = new Promise((resolve) => {
window[gapiOnLoaded] = (ev) => {
this.gapi = window[clientName];
// Loads the OAuth and other APIs asynchronously, and triggers login
// when they have completed.
let apisToLoad;
let callback = function() {
if (--apisToLoad === 0) {
resolve(window[clientName]);
}
};
apisToLoad = 3; // must match number of calls to gapi.client.load()
this.gapi.load('client:auth2', callback);
this.gapi.client.load('[ENDPOINT_1_NAME]', 'v1', callback, apiEndPoint);
this.gapi.client.load('[ENDPOINT_2_NAME]', 'v1', callback, apiEndPoint);
};
this.loadScript();
});
}
public GetClient(): any {
return this.loadAPI.then((res) => {
return this.gapi;
});
}
private loadScript() {
let node = document.createElement('script');
node.src = url;
node.type = 'text/javascript';
document.getElementsByTagName('head')[0].appendChild(node);
}
}
他のサービスでこのサービスを挿入します。私は各エンドポイントのサービスを作成しました。
@Injectable()
export class Endpoint1Service {
private gapi: any;
constructor(private googleApiService: GoogleAPIService) {
}
public isLoad() {
return this.googleApiService.GetClient().then((gapi) => {
this.gapi = gapi;
return true;
});
}
public action(data: DataType){
this.gapi.client.endpointname.apimethod(data).execute();
}
}
最初の質問は何を意味していますか?既にgoogleのapiのURLを追跡するための 'const url = ...'があるようです。あなたは何をしたいですか? –
私は複数のエンドポイントを持っているので、私はこれらをパブリック変数とは別に割り当てたいと思っていましたので、コンポーネントでmyservice.endpoint1serviceとして使用できます – Akanksha
@Akankshaこれは私を助けました!これについての更新情報はありますか?おそらく、Angular 2からCloud Endpointsに接続するための最新のバージョンのアプローチ(投稿されたラッパーを含む)を投稿することができますか? – jonasjuss