2015-11-22 6 views
0

У меня есть список городов с широтой и долготой. На карте я показываю 5 маркеров с деталями. Когда я нажимаю маркер, он показывает данные конкретного города в информационном окне, и все работает правильно.Как настроить всплывающее окно маркера карты Google?

Возможно ли отредактировать информационное окно?

Expectation: Когда я нажимаю маркер одно погружение должно прийти в нижней части страницы с тем, что детали маркера и влево, вправо стрелкой.

1.div должен содержать Chicago ПОЛУЧИТЬ (кнопка передать значение идентификатора) Это второй лучший город в мире! Чикаго»

2.Если я нажмите левую стрелку он должен перейти к левой стороне маркеров (на основе этих данных маркер должен изменить в этом DIV)

3.Если я нажмите стрелку вправо он должен перейти на правую сторону маркеры (на основе этих данных маркеров следует изменить в этом DIV)

angular.module('mapsApp', []) 
 
     .controller('MapCtrl', ['$scope', '$http', '$location', '$window', '$compile', function($scope, $http, $location, $window, $compile) { 
 
      var cities = [{ 
 
       id: '1', 
 
       city: 'Toronto', 
 
       desc: 'This is the best city in the world!', 
 
       lat: 43.7000, 
 
       long: -79.4000, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_purple.png' 
 
      }, { 
 
       id: '2', 
 
       city: 'New York', 
 
       desc: 'This city is aiiiiite!', 
 
       lat: 40.6700, 
 
       long: -73.9400, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_red.png' 
 
      }, { 
 
       id: '3', 
 
       city: 'Chicago', 
 
       desc: 'This is the second best city in the world!', 
 
       lat: 41.8819, 
 
       long: -87.6278, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_green.png' 
 
      }, { 
 
       id: '4', 
 
       city: 'Los Angeles', 
 
       desc: 'This city is live!', 
 
       lat: 34.0500, 
 
       long: -118.2500, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_blue.png' 
 
      }, { 
 
       id: '5', 
 
       city: 'Las Vegas', 
 
       desc: 'This city is live!', 
 
       lat: 36.0800, 
 
       long: -115.1522, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_yellow.png' 
 
      }]; 
 

 
      var mapOptions = { 
 
       zoom: 4, 
 
       center: new google.maps.LatLng(40.0000, -98.0000), 
 
       mapTypeId: google.maps.MapTypeId.TERRAIN 
 
      } 
 

 
      $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions); 
 

 
      $scope.markers = []; 
 

 
      var infoWindow = new google.maps.InfoWindow(); 
 

 
      var createMarker = function(info) { 
 

 
       var marker = new google.maps.Marker({ 
 
        map: $scope.map, 
 
        position: new google.maps.LatLng(info.lat, info.long), 
 
        title: info.city, 
 
\t \t \t \t \t icon: info.icon 
 
       }); 
 
       marker.content = '<div><h2>'+marker.title+'</h2><input type="button" value="get" ng-click="get(' + info.id + ')"/>' + '<div class="infoWindowContent">' + info.desc + '</div><div class="infoWindowContent">' + info.city + '</div></div>'; 
 

 
       google.maps.event.addListener(
 
        marker, 
 
        'click', (function(marker, $scope) { 
 
         return function() { 
 
          var compiled = $compile(marker.content)($scope); 
 
          $scope.$apply(); 
 
          infoWindow.setContent(compiled[0]); 
 
          infoWindow.open($scope.map, marker); 
 
         }; 
 
        })(marker, $scope) 
 
       ); 
 

 
       $scope.markers.push(marker); 
 
      } 
 
      $scope.get = function(id) { 
 
       console.log(id); 
 
       //alert("from $scope.get id : "+id); 
 
      } 
 
      for (i = 0; i < cities.length; i++) { 
 
       createMarker(cities[i]); 
 
      } 
 

 
      $scope.openInfoWindow = function(e, selectedMarker) { 
 
       e.preventDefault(); 
 
       google.maps.event.trigger(selectedMarker, 'click'); 
 
      } 
 

 

 

 

 
      $scope.clearMarkers = function() { 
 
       for (var i = 0; i < $scope.markers.length; i++) { 
 
        $scope.markers[i].setMap(null); 
 
       } 
 
       $scope.markers.length = 0; 
 
      } 
 

 

 

 
      $scope.filterMarkers = function() { 
 
       //1.select filtered cities 
 
       var filteredCities; 
 
       var cityDesc = $scope.data.singleSelect; 
 
       if (cityDesc == '0') { 
 
        filteredCities = cities; 
 
       } else { 
 
        filteredCities = cities.filter(function(c) { 
 
         if (c.desc == cityDesc) 
 
          return c; 
 
        }); 
 
       } 
 
       //2.update markers on map 
 
       $scope.clearMarkers(); 
 
       for (i = 0; i < filteredCities.length; i++) { 
 
        createMarker(filteredCities[i]); 
 
       } 
 
      } 
 

 
     }]);
#map { 
 
     height: 420px; 
 
     width: 600px; 
 
    } 
 
    
 
    .infoWindowContent { 
 
     font-size: 14px !important; 
 
     border-top: 1px solid #ccc; 
 
     padding-top: 10px; 
 
    } 
 
    
 
    h2 { 
 
     margin-bottom: 0; 
 
     margin-top: 0; 
 
    }
<script src="https://maps.googleapis.com/maps/api/js"></script> 
 
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script> 
 
<div ng-app="mapsApp" ng-controller="MapCtrl"> 
 
     <div id="map"></div> 
 
     <br> 
 
     <br> 
 
     <label>Filter Marker </label> 
 
     <br> 
 
     <select name="singleSelect" ng-model="data.singleSelect" ng-change="filterMarkers()"> 
 
      <option value="0">all</option> 
 
      <option value="This is the best city in the world!">This is the best city in the world!</option> 
 
      <option value="This city is aiiiiite">This city is aiiiiite</option> 
 
      <option value="This is the second best city in the world!">This is the second best city in the world!</option> 
 
      <option value="This city is live!">This city is live!</option> 
 
     </select> 
 
     <br> 
 
     <div id="class" ng-repeat="marker in markers | orderBy : 'title'"> 
 
      <a href="#" ng-click="openInfoWindow($event, marker)">{{marker.title}}</a> 
 
     </div> 
 
    </div>

ответ

0

Вы имеете в виду это:

<html> 
 
<head> 
 
<style> 
 
#map { 
 
     height: 420px; 
 
     width: 600px; 
 
    } 
 
    
 
    .infoWindowContent { 
 
     font-size: 14px !important; 
 
     border-top: 1px solid #ccc; 
 
     padding-top: 10px; 
 
    } 
 
    
 
    h2 { 
 
     margin-bottom: 0; 
 
     margin-top: 0; 
 
    } 
 
    .bar { 
 
    width:200px; 
 
    display:inline-block; 
 
    overflow: auto; 
 
    white-space: nowrap; 
 
    margin:0px auto; 
 
    border:1px red solid; 
 
} 
 
</style> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js"></script> 
 
<script src="https://maps.googleapis.com/maps/api/js"> </script> 
 
<script> 
 
angular.module('mapsApp', []) 
 
     .controller('MapCtrl', ['$scope', '$http', '$location', '$window', '$compile', function($scope, $http, $location, $window, $compile) { 
 
      var cities = [{ 
 
       id: '1', 
 
       city: 'Toronto', 
 
       desc: 'This is the best city in the world!', 
 
       lat: 43.7000, 
 
       long: -79.4000, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_purple.png' 
 
      }, { 
 
       id: '2', 
 
       city: 'New York', 
 
       desc: 'This city is aiiiiite!', 
 
       lat: 40.6700, 
 
       long: -73.9400, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_red.png' 
 
      }, { 
 
       id: '3', 
 
       city: 'Chicago', 
 
       desc: 'This is the second best city in the world!', 
 
       lat: 41.8819, 
 
       long: -87.6278, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_green.png' 
 
      }, { 
 
       id: '4', 
 
       city: 'Los Angeles', 
 
       desc: 'This city is live!', 
 
       lat: 34.0500, 
 
       long: -118.2500, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_blue.png' 
 
      }, { 
 
       id: '5', 
 
       city: 'Las Vegas', 
 
       desc: 'This city is live!', 
 
       lat: 36.0800, 
 
       long: -115.1522, 
 
\t \t \t \t icon:'http://labs.google.com/ridefinder/images/mm_20_yellow.png' 
 
      }]; 
 

 
      var mapOptions = { 
 
       zoom: 4, 
 
       center: new google.maps.LatLng(40.0000, -98.0000), 
 
       mapTypeId: google.maps.MapTypeId.TERRAIN 
 
      } 
 

 
      $scope.map = new google.maps.Map(document.getElementById('map'), mapOptions); 
 

 
      $scope.markers = []; 
 

 
      var infoWindow = new google.maps.InfoWindow(); 
 

 

 
      var createMarker = function(info,i) { 
 

 
       var marker = new google.maps.Marker({ 
 
        map: $scope.map, 
 
        position: new google.maps.LatLng(info.lat, info.long), 
 
        title: info.city, 
 
\t \t \t \t \t icon: info.icon 
 
       }); 
 
       marker.content = "<div><h2>"+marker.title+"</h2><input type='button' value='get' ng-click='get(" + info.id + ")'/>" + "<div class='infoWindowContent'>" + info.desc + "</div><div class='infoWindowContent'>" + info.city + "</div><div class='bar'><div style='float: left;'><button ng-click='markerClick("+(i-1)+")'><< LEFT</button></div><div style='float: right;'><button ng-click='markerClick("+(i+1)+")'>RIGHT >></button></div></div></div>"; 
 

 
       google.maps.event.addListener(
 
        marker, 
 
        'click', (function(marker, $scope) { 
 
         return function() { 
 
          var compiled = $compile(marker.content)($scope); 
 
          // $scope.$apply(); 
 
          infoWindow.setContent(compiled[0]); 
 
          infoWindow.open($scope.map, marker); 
 
         }; 
 
        })(marker, $scope) 
 
       ); 
 

 
       $scope.markers.push(marker); 
 
      } 
 
      $scope.markerClick=function(i){ 
 
      \t if(i===-1) 
 
      \t \t i=4; 
 
      \t if(i===5) 
 
      \t \t i=0 
 
      \t console.log("in marker click"+i); 
 

 
      \t google.maps.event.trigger($scope.markers[i], 'click'); 
 
      } 
 
      $scope.get = function(id) { 
 
       console.log(id); 
 
       //alert("from $scope.get id : "+id); 
 
      } 
 

 
      for (i = 0; i < cities.length; i++) { 
 
       createMarker(cities[i],i); 
 
      } 
 

 
      $scope.openInfoWindow = function(e, selectedMarker) { 
 
       e.preventDefault(); 
 
       google.maps.event.trigger(selectedMarker, 'click'); 
 
      } 
 

 

 

 

 
      $scope.clearMarkers = function() { 
 
       for (var i = 0; i < $scope.markers.length; i++) { 
 
        $scope.markers[i].setMap(null); 
 
       } 
 
       $scope.markers.length = 0; 
 
      } 
 

 

 

 
      $scope.filterMarkers = function() { 
 
       //1.select filtered cities 
 
       var filteredCities; 
 
       var cityDesc = $scope.data.singleSelect; 
 
       if (cityDesc == '0') { 
 
        filteredCities = cities; 
 
       } else { 
 
        filteredCities = cities.filter(function(c) { 
 
         if (c.desc == cityDesc) 
 
          return c; 
 
        }); 
 
       } 
 
       //2.update markers on map 
 
       $scope.clearMarkers(); 
 
       for (i = 0; i < filteredCities.length; i++) { 
 
        createMarker(filteredCities[i]); 
 
       } 
 
      } 
 

 
     }]); 
 
</script> 
 
</head> 
 
<body> 
 

 
<div ng-app="mapsApp" ng-controller="MapCtrl"> 
 
     <div id="map"></div> 
 
     <br> 
 
     <br> 
 
     <label>Filter Marker </label> 
 
     <br> 
 
     <select name="singleSelect" ng-model="data.singleSelect" ng-change="filterMarkers()"> 
 
      <option value="0">all</option> 
 
      <option value="This is the best city in the world!">This is the best city in the world!</option> 
 
      <option value="This city is aiiiiite">This city is aiiiiite</option> 
 
      <option value="This is the second best city in the world!">This is the second best city in the world!</option> 
 
      <option value="This city is live!">This city is live!</option> 
 
     </select> 
 
     <br> 
 
     <div id="class" ng-repeat="marker in markers | orderBy : 'title'"> 
 
      <a href="#" ng-click="openInfoWindow($event, marker)">{{marker.title}}</a> 
 
     </div> 
 
    </div> 
 

 
</body> 
 
</html>

я не буду в состоянии помочь вам с моделированием и выравнивая кнопок, но я пытался поставить его близко к вашим ожиданиям.

+0

да, но вместо этого информационного окна, как я могу сделать один div в bottom.div должен отображать всю эту информацию –

+0

u означает нижнюю часть всей страницы, например, нижнюю колонтитулу? в этом случае просто выньте эту панель кнопок из компиляции, поместите ее в ключ в маркере и нажмите на маркер, чтобы этот контент marker.key был видимым, чтобы поместить его в нижний колонтитул, изменяя стиль класса bar, а именно –

+0

можно добавить дно бар –

0

Вы можете добавить HTML элемент непосредственно в переменную маркера:

var marker = new google.maps.Marker({ 
        map: $scope.map, 
        position: new google.maps.LatLng(info.lat, info.long), 
        title: info.city, 
        icon: info.icon 
        html: <your html code here> 
       }); 
+0

вы можете добавить jsfiddle для этого –

+0

Я никогда не использовал jsfiddle. Я думаю, вы должны просто добавить строку 'html:' прямо в вашу функцию createMarker в пределах переменной маркера. Если это не сработает, я не смогу оказать дальнейшую помощь. Я не знаю этого в js. –

+0

как я могу сделать левую стрелку вправо стрелкой функцию –

Смежные вопросы