使用角度谷歌地图时如何正确处理标记点击事件?

Posted

技术标签:

【中文标题】使用角度谷歌地图时如何正确处理标记点击事件?【英文标题】:How to properly handle marker on-click event when using angular google maps? 【发布时间】:2016-03-15 20:40:35 【问题描述】:

我想在我的 ASP.NET MVC 应用程序中使用 Angular Google Maps (http://angular-ui.github.io/angular-google-maps)。我有一张地图,我有标记,markerClick 显示一个警报。但是,我希望能够在 markerClick 函数中获取标记数据。不幸的是,数据未定义。有什么想法吗?

html

<div ng-app="angular-app">
    <div ng-controller="MapController">
        <ui-gmap-google-map center="map.position" zoom="map.zoom" ng-init="initialize()">
            <ui-gmap-markers models="markers" coords="'location'" doCluster="'true'" idkey="markers.id" click="markerClick()"></ui-gmap-markers>
        </ui-gmap-google-map>
    </div>
</div>

JS(仅来自我的控制器的相关标记点击):

//...
$scope.markerClick = function (data) 
    alert('data is undefined :-(');
;
//...

编辑:这个问题也可以用另一种方式提出。如何正确使用 ui-gmap-markers 和 ui-gmap-window?文档很差,唯一的例子是 ui-gmap-marker...

【问题讨论】:

【参考方案1】:

我在 plunker 上找到了一个很好的例子。

HTML:

<div ng-app="appMaps">
    <div id="map_canvas" ng-controller="mainCtrl">
        <ui-gmap-google-map center="map.center" zoom="map.zoom">

            <ui-gmap-window show="map.window.show"
                            coords="map.window.model"
                            options="map.window.options"
                            closeClick="map.window.closeClick()"
                            templateUrl="'infowindow.tpl.html'"
                            templateParameter="map.window">
            </ui-gmap-window>

            <ui-gmap-markers models="map.markers"
                             coords="'self'"
                             events="map.markersEvents"
                             options="'options'">
            </ui-gmap-markers>

        </ui-gmap-google-map>
    </div>
</div>

JS:

angular.module('appMaps', ['uiGmapgoogle-maps'])
.controller('mainCtrl', function($scope) 
$scope.map = 
  center: 
    latitude: 39.5925511,
    longitude: 2.633202
  ,
  zoom: 14,
  markers: [
    id: 1,
    latitude: 39.5924115,
    longitude: 2.6468146

  , 
    id: 2,
    latitude: 39.5925511,
    longitude: 2.633202
  ],
  markersEvents: 
    click: function(marker, eventName, model) 
      console.log('Click marker');
      $scope.map.window.model = model;
      $scope.map.window.show = true;
    
  ,
  window: 
    marker: ,
    show: false,
    closeClick: function() 
      this.show = false;
    ,
    options:  
  
;
);

Plunker:http://plnkr.co/edit/HUYHuAUgUlUhDd1MRf3D?p=preview

唯一的问题是窗口会准确地显示在图钉的位置,而不是图钉上方。有谁知道我该如何解决这个问题?不好看……

编辑: 这解决了窗口的问题:

uiGmapGoogleMapApi.then(function (maps) 
    // offset to fit the custom icon
    $scope.map.window.options.pixelOffset = new google.maps.Size(0, -35, 'px', 'px');
);

【讨论】:

很高兴看到我的 plunker 帮助了某人 :) 关于窗口位置问题,只需指出您可以直接在控制器中设置相对于标记的位置。更改 ´options:´ 每个 ´options: pixelOffset: width: -150, height: -395´(示例值)。只是实现相同目的的另一种方式。 +1 为了修复窗口位置问题,我添加了:options: pixelOffset: new maps.Size(0, -40) to $scope.map.window above.. 是偏移 x 和 y 坐标从标记窗口【参考方案2】:

你试过了吗:

ng-click="markerClick($event)" 

【讨论】:

嗯,我看到的和你一样。我深入研究了他们的代码。看起来像一个库错误。我会联系开发团队中的某个人。【参考方案3】:

我认为这是您尝试的方式,在您原来的问题中,去掉括号,您将获得三个变量:

标记的文档说:

PerModel / 或表达式绑定:单击标记时执行的事件处理程序。如果您提供函数名称(例如“markerClick”),您将获得三个不同的参数: 您点击的生成的 google.maps.Marker 的实例; 事件名称; 您在模型中的确切点击标记对象。

我也在用标记做你正在做的事情,但我想我会用标记尝试一下,即使文档在标记下。

在我的 HTML 中:

<ui-gmap-marker>
                    <!-- All the other options -->
                    click = 'mapCtrl.markerClicked'>
</ui-gmap-marker>

在我的 javascript 中:

this.markerClicked = function(googleMarker, eventName, modelMarker)
    
        console.log(googleMarker);
        console.log(eventName);
        console.log(modelMarker);
    

关键是不要在函数名称后面的 HTML 中放置括号。我得到了谷歌地图实例、名称“click”和一个带有我的 id 的标记,这是我需要的。

希望这会有所帮助。

【讨论】:

以上是关于使用角度谷歌地图时如何正确处理标记点击事件?的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在谷歌地图中添加带有点击事件的多个标记? [复制]

点击谷歌地图上的标记后,角度生命周期不再触发 - Ionic 3

谷歌地图标记事件监听器点击[重复]

如何检测长点击谷歌地图标记

点击标记时如何更新谷歌地图标记图像

通过触摸或点击在 Android 谷歌地图上添加标记