2017-06-01 22 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} 

Cũng đã thử panTo với cùng một kết quả.setCenter không hoạt động trong angular2-google-maps

+0

Bạn có thể vui lòng cung cấp một số chi tiết hơn với câu hỏi? –

Trả lời

16

Cuối cùng, tính năng này hoạt động. Đã phải tạo một thành phần con của agm-map và tạo ra một kết quả đầu ra khi tải, lấy gói bản đồ api bản đồ google bản địa và chuyển vào thành phần bản đồ gốc của tôi. Tôi ước họ đã tạo ra nó để bạn có thể lấy gmaps api wrapper trong thành phần thông thường agm-map. Làm việc với panTo là tốt.

PHỤ HUYNH COMPONENT Markup

<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> 

PHỤ HUYNH COMPONENT

/** 
* 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); 
    } 
} 

CON COMPONENT

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

không có cách nào khác ngoài thành phần con? –

+0

@ f.khantsis Đúng, đây là giải pháp duy nhất tôi đã tìm thấy. Nó không phải là rất duyên dáng. –

+0

Tôi muốn thêm rằng bạn không cần tiêm 'gMap' vì bản sao sẽ đến từ đứa trẻ. Bạn cũng không cần phải thêm trình bao bọc vào các nhà cung cấp mô-đun của mình, chỉ cần sử dụng cá thể 'this.map'. Tôi không chắc chắn lý do tại sao wrapper không được tiếp xúc bởi thành phần agm theo mặc định nhưng dường như điều này là do thiết kế: "GoogleMapsAPIWraper được tạo ra khi một cá thể bản đồ agm được tạo. Đây là hoàn toàn có chủ ý. Chúng tôi duy trì một cá thể trên mỗi bản đồ. muốn có thể hiện bản đồ, bạn có thể tạo một thành phần tùy chỉnh và đưa GoogleMapsAPIWrapper qua hàm tạo. " – cen