web-dev-qa-db-ja.com

angular2とTypeScriptでのGoogleサインイン-どこでgapiを入手できますか?

次の質問に従って、angular2でGoogleサインインを使用しようとしています: ウェブサイト用のGoogleサインインとAngular TypeScriptを使用して2

しかし、エラーが発生します:

ORIGINAL EXCEPTION: ReferenceError: gapi is not defined
ORIGINAL STACKTRACE:
ReferenceError: gapi is not defined
    at LoginAppComponent.ngAfterViewInit (http://localhost:3000/app/login.component.js:33:9)
    at DebugAppView._View_AppComponent0.detectChangesInternal (AppComponent.template.js:46:68)
    at DebugAppView.AppView.detectChanges (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:12143:18)
    at DebugAppView.detectChanges (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:12247:48)
    at DebugAppView.AppView.detectViewChildrenChanges (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:12169:23)
    at DebugAppView.AppView.detectChangesInternal (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:12154:18)
    at DebugAppView.AppView.detectChanges (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:12143:18)
    at DebugAppView.detectChanges (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:12247:48)
    at ViewRef_.detectChanges (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:10397:69)
    at eval (http://localhost:3000/node_modules/@angular/core//bundles/core.umd.js:9911:88)

明らかにギャップは定義されていません-私は空の変数を宣言しているように見えるので理解できます。

私の現在のコードは以下の通りです:

import {Component, NgZone} from "@angular/core";

declare var gapi: any;

@Component({
    selector: "login",
    templateUrl: "templates/login-template.html"
})
export class LoginAppComponent {
  googleLoginButtonId = "google-login-button";
  userAuthToken = null;
  userDisplayName = "empty";

  constructor(private _zone: NgZone) {
    console.log(this);
  }

  // Angular hook that allows for interaction with elements inserted by the
  // rendering of a view.
  ngAfterViewInit() {
    // Converts the Google login button stub to an actual button.
    gapi.signin2.render(
      this.googleLoginButtonId,
      {
        "onSuccess": this.onGoogleLoginSuccess,
        "scope": "profile",
        "theme": "dark"
      });
  }

  // Triggered after a user successfully logs in using the Google external
  // login provider.
  onGoogleLoginSuccess = (loggedInUser) => {
    this._zone.run(() => {
        this.userAuthToken = loggedInUser.getAuthResponse().id_token;
        this.userDisplayName = loggedInUser.getBasicProfile().getName();
    });
}
}

テンプレートは正常に読み込まれ、gapiビットにすぎません。

だから私の質問は:何が欠けているのですか?機能させるためにgapiをどのように定義する必要がありますか?

これが私のメインのapp.componentコードです:

import { Component } from '@angular/core';
import { LoginAppComponent } from './login.component'

@Component({
  selector: 'my-app',
  template: `<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script>
            <script>
            window.onLoadCallback = function(){
              gapi.auth2.init({
                  client_id: 'filler_text_for_client_id.apps.googleusercontent.com'
                });
            }
            </script>
             <h1>Angular2 P.O.C.</h1>
             <login></login>`,
  directives: [LoginAppComponent]
})
export class AppComponent { }
12
NDevox

GoogleプラットフォームAPIスクリプトを含めましたか?

<script src="https://apis.google.com/js/platform.js"></script>

コードを実行する前にGAPIスクリプトが読み込まれるのを待つ方法については、 この質問 を参照してください。

10
rphv

Angular v4.でも同じ問題がありました。 async deferGoogleプラットフォームAPIスクリプトから削除すると、問題が解決しました

私のようなGoogleプラットフォームのAPIを使用したときの私の問題は以下のようなものでした:

<script src="https://apis.google.com/js/platform.js" async defer></script>

enter image description here

async deferGoogleプラットフォームAPIスクリプトから破棄して問題を解決しましたindex.html

<script src="https://apis.google.com/js/platform.js"></script>
6
Amir

エラーを削除するために、次のファイルをプロジェクト構造に追加します。

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/gapi/gapi.d.ts

これにより、プロジェクトでギャップが利用可能になります。

0
Nipun Madan

Index.htmlで次のスクリプトを呼び出して問題を解決しました

<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script>

注:

async deferなしで次のスクリプトを使用します。

<script src="https://apis.google.com/js/platform."></script> 

このスクリプトではasync deferを使用します

<script src="https://apis.google.com/js/platform.js?onload=onLoadCallback" async defer></script>
0
Amuk Saxena