Search code examples
angularjsgoogle-mapsng-map

Pass an object as part of ng-map marker


Using markers in ng-map with angular JS

<ng-map zoom-to-include-markers="auto" default-style="false" class="myMap">
    <marker ng-repeat="Customer in ListForDisplay"  position="{{Customer.location.lat}},{{Customer.location.lng}}" icon="{{Customer.icon}}" clickedaddress="{{Customer.address}}" clickedextras="{{Customer.extrasString}}" data="{{Customer}}"  on-click="markerSingleClick($event)" on-dblclick="markerDoubleClick($event)"></marker>
</ng-map>

I can access the string variables in the controller, but the object data still stays undefined in debugging sessions:

$scope.markerSingleClick = function (event) {
     var clickedaddress = this.clickedaddress;
     var clickedextras = this.clickedextras;
     var data = this.data;

Is there a way to pass an entire object as part of the marker, rather than single string properties


Solution

  • To pass current object as a parameter via marker on-click event, replace

    on-click="markerSingleClick($event)"
    

    with

    on-click="markerSingleClick({{Customer}})"
    

    and then update markerSingleClick function:

    $scope.markerSingleClick= function (event,customer) {
        //...          
    }; 
    

    Working example

    angular.module('mapApp', ['ngMap'])
        .controller('mapCtrl', function ($scope, NgMap) {
    
    
            NgMap.getMap().then(function (map) {
                $scope.map = map;
            });
            $scope.cities = [
                { id: 1, name: 'Oslo', pos: [59.923043, 10.752839] },
                { id: 2, name: 'Stockholm', pos: [59.339025, 18.065818] },
                { id: 3, name: 'Copenhagen', pos: [55.675507, 12.574227] },
                { id: 4, name: 'Berlin', pos: [52.521248, 13.399038] },
                { id: 5, name: 'Paris', pos: [48.856127, 2.346525] }
            ];
    
            $scope.showInfo = function (event,city) {
                  alert(JSON.stringify(city));
                  //console.log(city);
            };
        });
    <script src="https://code.angularjs.org/1.4.8/angular.js"></script>
        <script src="https://maps.googleapis.com/maps/api/js?key="></script>
        <script src="https://rawgit.com/allenhwkim/angularjs-google-maps/master/build/scripts/ng-map.js"></script> 
    <div ng-app="mapApp" ng-controller="mapCtrl">
            <ng-map zoom="5" center="59.339025, 18.065818">            
                <marker ng-repeat="c in cities" position="{{c.pos}}" title="{{c.name}}" id="{{c.id}}" on-click="showInfo({{c}})">
                </marker>
            </ng-map>
        </div>


    Another option would be to pass object identifier as a parameter, for example its index:

    <marker ng-repeat="c in cities" on-click="showInfo($index)" position="{{c.pos}}" title="{{c.name}}" id="{{c.id}}">
    </marker>
    

    Then current object could be determined like this:

    $scope.showInfo = function (event,index) {
         var currentCity = $scope.cities[index]; 
         //console.log(currentCity);
    };