将googlemaps添加到angular-cli

tst*_*lfe 4 angular-cli typescript-typings angular

我正在尝试将googlemaps实施到我的angular-cli项目中.我知道有一个'angular2-google-maps'组件(github),但我需要路由和更多自定义功能.

我找到了两种将地图实现到项目中的方法:

1:stackoverflow:使用谷歌api加载器 - 但我无法弄清楚如何初始化谷歌地图...

2:使用DefinitelyTyped google.maps.d.ts.我用--global安装它(因为环境已被弃用..)到我的项目中并将index.d.ts(用于全局)添加到src/typings.d.ts并且可以使用"google.map .." .ts文件:

  myLatLng = {lat: -25.363, lng: 131.044};
  map:any;

  constructor() {
    this.map = new google.maps.Map(document.getElementById('map'), {
      center: this.myLatLng,
      zoom: 4
    });
  }
Run Code Online (Sandbox Code Playgroud)

但如果我用angular-cli构建它就会出错:"ReferenceError:google is not defined"

有任何想法吗?

tst*_*lfe 6

这是一个分步指南,将一个谷歌地图组件添加到angular-cli项目.

第1步:从DefinitelyTyped安装google.maps:

typings i dt~google.maps --global --save
Run Code Online (Sandbox Code Playgroud)

第2步:如果您安装了较旧的打字,请添加

/// <reference path="../typings/index.d.ts" />
Run Code Online (Sandbox Code Playgroud)

到你的src/typings.d.ts

第3步:生成新组件

ng g component google-maps
Run Code Online (Sandbox Code Playgroud)

将以下代码添加到:

.ts:

  height = '100px';
  myLatLng = {lat: -25.363, lng: 131.044};
  map:any;

  constructor(private googleApi:GoogleApiService) {}

  ngOnInit() {
    this.googleApi.initMap().then(() => {

      let latlng = new google.maps.LatLng(this.myLatLng.lat, this.myLatLng.lng);

      this.map = new google.maps.Map(document.getElementById('map'), {
        center: latlng,
        zoom: 4
      });

      new google.maps.Marker({
        position: latlng,
        map: this.map,
        title: 'Hello World!'
      });
    });
  }
Run Code Online (Sandbox Code Playgroud)

.html:

<div id="map" [style.height]="height"></div>
Run Code Online (Sandbox Code Playgroud)

Step4:生成新服务

ng g service google-maps/shared/google-api
Run Code Online (Sandbox Code Playgroud)

将GoogleApiService + HTTP_PROVIDERS添加到src/main.ts

代码:

const API_KEY = '[insert your code]';
const url = 'https://maps.googleapis.com/maps/api/js?key='+ API_KEY +'&callback=initMap';

@Injectable()
export class GoogleApiService {
  private loadMap: Promise<any>;

  constructor(private http:Http) {
    this.loadMap = new Promise((resolve) => {
      window['initMap'] = () => {
        resolve();
      };
      this.loadScript()
    });
  }

  public initMap():Promise<any> {
    return this.loadMap;
  }

  private loadScript() {
    let script = document.createElement('script');
    script.src = url;
    script.type = 'text/javascript';

    if (document.body.contains(script)) {
      return;
    }
    document.getElementsByTagName('head')[0].appendChild(script);
  }
}
Run Code Online (Sandbox Code Playgroud)

也许您需要从spec.ts文件中删除一些行.但是,您可以将GoogleMapsComponent添加为指令.

  • 通过路线等扩展非常容易.如果我有时间,我可以将当​​前版本的GoogleMapsComponent上传到github.