Angular 2 (Angular-cli) : Uncaught ReferenceError: google is not defined

Radouane ROUFID picture Radouane ROUFID · Feb 20, 2017 · Viewed 13.5k times · Source

I have been struggling for a couple of hours trying to make work googlemaps PlaceResult in my Angular 2 project that uses Angular-cli.

I had to install googlemaps using @types and add it under the attribute "types" of my tsconfig.json configuration file.

{
    ...
    "types": [
      "google-maps"
    ]
  }
}

And I succeed to use google.maps.places.PlaceResult in my Angular 2 Component by simply importing it !

import { ActivatedRoute, Params } from "@angular/router";
import { MapsAPILoader } from "angular2-google-maps/core";

import PlaceResult = google.maps.places.PlaceResult;
import GeocoderRequest = google.maps.GeocoderRequest;
...

Several hours later, I had to work with google.maps.Marker, which is in the same definition file as PlaceResult and GeocoderRequest. So I simply imported it as below :

[Line 12] import PlaceResult = google.maps.places.PlaceResult;
[Line 13] import GeocoderRequest = google.maps.GeocoderRequest;
[Line 14] import Marker = google.maps.Marker;
[Line 15] import LatLng = google.maps.LatLng;
...

But I had an unexpected error at runtime saying

Uncaught ReferenceError: google is not defined    search.component.ts:14
at Object.444 (search.component.ts:14)
at __webpack_require__ (bootstrap 26c2b97…:52)
at Object.727 (app.config.ts:11)
at __webpack_require__ (bootstrap 26c2b97…:52)
at Object.602 (src async:7)
at __webpack_require__ (bootstrap 26c2b97…:52)
at Object.1258 (.*$:7)
at __webpack_require__ (bootstrap 26c2b97…:52)
at webpackJsonpCallback (bootstrap 26c2b97…:23)
at main.bundle.js:1    

Please note that webpack throws this error at line 14 of my component. Meaning that (and correct me if I'm wrong) the previous lines (that uses the same "google") worked well.

Am'I missing something ?


I use :

  • Angular : 2.4
  • Angular-CLI : 1.0.0-beta.24
  • typescript : 2.0.10
  • angular2-google-maps: 0.17.0

Answer

Radouane ROUFID picture Radouane ROUFID · Jun 1, 2017

Update

Regarding import LatLngBounds = google.maps.LatLngBounds; I find out that I was calling the custructor (new LatLngBounds()) before the init of Maps api. In fact, I'm using @agm/core;. And constructor has to be called after load() as below

ngOnInit() {
    this.mapsAPILoader.load().then(() => {

                    this.page$.subscribe(page => {
                        if (page && page.content) {
                            this.latLngBounds = new google.maps.LatLngBounds();

                            page.content.forEach(w => this.latLngBounds.extend(new google.maps.LatLng(lat, lng)));
                        }
                    });

                }
            );
}

and I added in my typings.d.ts the following import

import {} from '@types/googlemaps';

Original answer

I solved my problem by having the following config :

1- package.json

"dependencies": {
    ...
    "googlemaps": "^1.12.0",
    ...
  }

2- tsconfig.json

"types": [
      ...
      "googlemaps"
    ]

3- And add the google api script in my index.html

<head>
    ...
</head>
<body>
   <app-root>Loading...</app-root>

   <script src="https://maps.googleapis.com/maps/api/js?key=KEY&libraries=places&language=fr" async defer></script>
</body>
</html> 

4- In components, use it like below

declare var google: any;

@Component({
    ...
})
export class SearchComponent implements OnInit, AfterViewInit {

    // Google Maps
    bounds: google.maps.LatLngBounds;
    markers: google.maps.Marker[];
    infoWindow: google.maps.InfoWindow;

}