2017-06-01 1 views
10
import { GoogleMapsAPIWrapper } from '@agm/core'; 
import { Component, Input } from '@angular/core'; 

@Component({ 
    selector: 'core-map', 
    styleUrls: [ './map.component.scss' ], 
    templateUrl: './map.component.html', 
}) 
export class MapComponent { 
    constructor(
    public gMaps: GoogleMapsAPIWrapper 
) {} 

    public markerClicked = (markerObj) => { 
    this.gMaps.setCenter({ lat: markerObj.latitude, lng: markerObj.longitude }); 
    console.log('clicked', markerObj, { lat: markerObj.latitude, lng: markerObj.longitude }); 
    } 
} 
console output: Object {lat: 42.31277, lng: -91.24892} 

Vous avez également essayé panTo avec le même résultat.setCenter ne fonctionne pas dans angulaire2-google-maps

+0

Pouvez-vous s'il vous plaît fournir quelques plus de détails avec la question? –

Répondre

16

Enfin obtenu ce travail. J'ai dû créer un composant enfant de agm-map et créer une sortie qui, en charge, récupère le wrapper api google maps natif et passe dans mon composant map parent. Je souhaite qu'ils l'aient fait afin que vous puissiez simplement saisir le wrapper gmaps api dans le composant agm-map régulier. Fonctionne avec panTo aussi bien.

PARENT MARKUP COMPOSANTE

<agm-map [latitude]='lat' [longitude]='lng' 
    [usePanning]='true'> 
    <agm-marker *ngFor='let location of locations' 
    [latitude]='location.latitude' 
    [longitude]='location.longitude' 
    [iconUrl]='location.icon' 
    (markerClick)='markerClicked(location)'></agm-marker> 
    <core-map-content (onMapLoad)='loadAPIWrapper($event)'></core-map-content> 
</agm-map> 

PARENT COMPOSANTE

/** 
* Map Component 
* API Docs: https://angular-maps.com/docs/api/latest/ts/ 
*/ 
import { GoogleMapsAPIWrapper } from '@agm/core'; 
import { Component, Input } from '@angular/core'; 

declare var google:any; 

@Component({ 
    selector: 'core-map', 
    styleUrls: [ './map.component.scss' ], 
    templateUrl: './map.component.html', 
}) 
export class MapComponent { 
    @Input() lat: number; 
    @Input() lng: number; 
    @Input() locations: {}; 
    map: any; 

    constructor(
    public gMaps: GoogleMapsAPIWrapper, 
) {} 

    public loadAPIWrapper(map) { 
    this.map = map; 
    } 

    public markerClicked = (markerObj) => { 
    const position = new google.maps.LatLng(markerObj.latitude, markerObj.longitude); 
    this.map.panTo(position); 
    } 
} 

ENFANT COMPOSANTE

import { Component, EventEmitter, OnInit, Output } from '@angular/core'; 

import { GoogleMapsAPIWrapper } from '@agm/core'; 

@Component({ 
    selector: 'core-map-content', 
    template: '', 
}) 
export class MapContentComponent implements OnInit { 
    @Output() onMapLoad: EventEmitter<{}> = new EventEmitter<{}>(); 

    constructor(public gMaps: GoogleMapsAPIWrapper) {} 

    ngOnInit() { 
    this.gMaps.getNativeMap().then((map) => { 
     this.onMapLoad.emit(map); 
    }); 
    } 
} 
+0

il n'y a pas d'autre façon qu'avec le composant enfant? –

+0

@ f.khantsis Correct, c'est la seule solution que j'ai trouvée. Ce n'est pas très gracieux. –

+0

Je voudrais ajouter que vous n'avez pas besoin de l'injection 'gMap' puisque l'instance proviendra de l'enfant. Vous n'avez pas non plus besoin d'ajouter le wrapper à vos fournisseurs de modules, utilisez simplement l'instance 'this.map'. Je ne suis pas sûr pourquoi wrapper n'est pas exposé par le composant agm par défaut, mais apparemment c'est par conception: "Le GoogleMapsAPIWraper est créé quand une instance d'agm-map est créée.C'est intentionnel.Nous maintenons une instance par carte. Pour obtenir l'instance de la carte, vous pouvez créer un composant personnalisé et injecter GoogleMapsAPIWrapper via le constructeur. " – cen