Javascript Angular 2如何在多个组件中使用谷歌地图

Javascript Angular 2如何在多个组件中使用谷歌地图,javascript,angular,google-maps,Javascript,Angular,Google Maps,我正在构建使用谷歌地图api的Angular4项目。我构建了一个名为basemap的组件,其中通过jsonp包含了google api(以消除使用http模块时的跨源错误),如下所示(basemap.component.ts): 这很好,但是当我使用ngFor在同一个页面中多次使用这个组件时,问题就来了 <div *ngFor="let i of [1,2,3]"> <app-basemap ></app-basemap> </div> 因为

我正在构建使用谷歌地图api的Angular4项目。我构建了一个名为basemap的组件,其中通过jsonp包含了google api(以消除使用http模块时的跨源错误),如下所示(basemap.component.ts):

这很好,但是当我使用ngFor在同一个页面中多次使用这个组件时,问题就来了

 <div *ngFor="let i of [1,2,3]">  <app-basemap ></app-basemap> </div>

因为我正在使用作为地图可视化api和谷歌变种插件来查看谷歌底图。

对于前来搜索解决方案的任何人,我已经设法使用RXJS解决了这个问题: 我在中创建了一个服务google-api.service.ts,如下所示:

import { Injectable } from '@angular/core';
import { Jsonp, Headers } from '@angular/http';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/retry';

@Injectable()
export class GoogleAPIService {
private googleReadyObservable;
constructor(
   private jsonp: Jsonp
) {
  this.googleReadyObservable = new Subject();
  this.jsonp
  .get(`https://maps.googleapis.com/maps/api/js?key=MYKEY&callback=JSONP_CALLBACK`)
  .retry()
  .subscribe(res => {
    if (res.status === 200) {
      this.googleReadyObservable.complete();
    }
  });
 };

googleReady() {
return this.googleReadyObservable;
  };
}
this.googleAPIService.googleReady()
    .subscribe(
  null,
  err => console.log(err),
  () => {
     // google maps global object loaded
  }
  );
然后在任何组件foo.component.ts中导入服务文件,然后将其注入构造函数

constructor ( 
  private googleAPIService: GoogleAPIService
 ){  }
然后在以下任何功能中使用它:

import { Injectable } from '@angular/core';
import { Jsonp, Headers } from '@angular/http';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/retry';

@Injectable()
export class GoogleAPIService {
private googleReadyObservable;
constructor(
   private jsonp: Jsonp
) {
  this.googleReadyObservable = new Subject();
  this.jsonp
  .get(`https://maps.googleapis.com/maps/api/js?key=MYKEY&callback=JSONP_CALLBACK`)
  .retry()
  .subscribe(res => {
    if (res.status === 200) {
      this.googleReadyObservable.complete();
    }
  });
 };

googleReady() {
return this.googleReadyObservable;
  };
}
this.googleAPIService.googleReady()
    .subscribe(
  null,
  err => console.log(err),
  () => {
     // google maps global object loaded
  }
  );

对于前来寻找解决方案的任何人来说,我已经设法使用RXJS解决了这个问题: 我在中创建了一个服务google-api.service.ts,如下所示:

import { Injectable } from '@angular/core';
import { Jsonp, Headers } from '@angular/http';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/retry';

@Injectable()
export class GoogleAPIService {
private googleReadyObservable;
constructor(
   private jsonp: Jsonp
) {
  this.googleReadyObservable = new Subject();
  this.jsonp
  .get(`https://maps.googleapis.com/maps/api/js?key=MYKEY&callback=JSONP_CALLBACK`)
  .retry()
  .subscribe(res => {
    if (res.status === 200) {
      this.googleReadyObservable.complete();
    }
  });
 };

googleReady() {
return this.googleReadyObservable;
  };
}
this.googleAPIService.googleReady()
    .subscribe(
  null,
  err => console.log(err),
  () => {
     // google maps global object loaded
  }
  );
然后在任何组件foo.component.ts中导入服务文件,然后将其注入构造函数

constructor ( 
  private googleAPIService: GoogleAPIService
 ){  }
然后在以下任何功能中使用它:

import { Injectable } from '@angular/core';
import { Jsonp, Headers } from '@angular/http';
import { Subject } from 'rxjs/Subject';
import 'rxjs/add/operator/retry';

@Injectable()
export class GoogleAPIService {
private googleReadyObservable;
constructor(
   private jsonp: Jsonp
) {
  this.googleReadyObservable = new Subject();
  this.jsonp
  .get(`https://maps.googleapis.com/maps/api/js?key=MYKEY&callback=JSONP_CALLBACK`)
  .retry()
  .subscribe(res => {
    if (res.status === 200) {
      this.googleReadyObservable.complete();
    }
  });
 };

googleReady() {
return this.googleReadyObservable;
  };
}
this.googleAPIService.googleReady()
    .subscribe(
  null,
  err => console.log(err),
  () => {
     // google maps global object loaded
  }
  );

为url提供key-in-index.html

为url提供key-in-index.html

关于@Vega,这正是我正在使用的。不,你的版本是,它与简化问题的版本不同,我将以任何方式编辑问题。好的,但你应该始终输入发生代码,plunkr更好关于@Vega的说明这正是我正在使用的。不,你的版本是,它与简化问题的版本不同,不管怎样,我都会编辑这个问题。好的,但你应该始终输入发生代码,plunkr更好这应该是“注释”。试着在注释部分添加这些类型的(答案或建议)。请选择“评论”。尝试将这些类型的(答案或建议)添加到评论部分。请