GoogleMaps - отображение окна информации (angularjs)

Мне было интересно, можете ли вы мне помочь. С помощью angular js v1 у меня есть карта, встроенная в мою веб-страницу, которая:

  • Позволяет пользователю ввести пункт отправления и пункт назначения.
  • Наносит на карту маркеры и отображает маршрут от пункта отправления и пункта назначения.
  • Отображает рестораны (как маркеры) для путевых точек в исходной точке, в пункте назначения, а также в средней путевой точке. (Итак, 3 балла, не злоупотребляю ли я запросами / лимитами API Google.

Проблема: Когда я нажимаю на маркеры, мой InfoWindow не появляется. Кажется, что по умолчанию они естественно появляются для пункта отправления и пункта назначения, но я не могу понять, как сделать так, чтобы они отображались для всех ресторанов, которые отображаются в виде маркеров. (Для этого используется PlaceSearch).

Я много гуглил, но, поскольку я новичок в JS / Angular, я не могу найти лучший подход.

Мой код директивы ниже, с некоторым кодом infoWindow, но, как вы можете видеть, я в тупике. Не уверены, нужен ли мне обработчик кликов?

    googleMap.$inject = [];
     function googleMap() {

    return {
     restrict: 'E',
     template: '<div class = "google-map"></div>',
     replace: true,
     scope: {
       center: '=',
       zoom: '=',
       origin: '=',
       destination: '=',
       travelMode: '='
    },

    link($scope, $element) {
      const map = new google.maps.Map($element[0], {
        zoom: $scope.zoom,
        center: $scope.center
      });

      const directionsService = new google.maps.DirectionsService();
      const directionsDisplay = new google.maps.DirectionsRenderer();
      const placesService = new google.maps.places.PlacesService(map);
      // const infoWindows = [];
      // const infowindow = new google.maps.InfoWindow();
      // let marker = new google.maps.Marker;

      directionsDisplay.setMap(map);

      $scope.$watch('center', () => map.setCenter($scope.center), true);

      $scope.$watchGroup(['origin', 'destination', 'travelMode'], 
    displayRoute);

      // DISPLAY ROUTE
      function displayRoute() {
        if (!$scope.origin || !$scope.destination || !$scope.travelMode) 
    return false;

        directionsService.route({
          origin: $scope.origin,
          destination: $scope.destination,
          travelMode: $scope.travelMode
        }, (response) => {

          directionsDisplay.setDirections(response);

          // beginning of this form
          // response.routes[0].legs[0].steps.map(step => {
          const steps = response.routes[0].legs[0].steps
          const lookup = [steps[0], steps[Math.round(steps.length / 2)], 
          steps[steps.length - 1]]
          lookup.map(step => {


            placesService.nearbySearch({
              location: step.start_point,
              radius: 50,
              type: ['restaurant'],
              openNow: true
            }, (results) => {
              results.map(place => {
                console.info(place.name);
                return new google.maps.Marker({
                  map: map,
                  position: place.geometry.location,
                  // label: '⭐️',
                  title: place.name
                });  //google maps marker
              });

              results.map(place => {
                console.info(place.vicinity);
                const contentString = place.name;
                return new google.maps.InfoWindow({
                  title: place.name,
                  content: contentString
                });  //google maps marker
                // infoWindows.push(infowindow);
              });


            });
          }); //end of this function

        });  //end return directionsdisplay
      }  //display route ends


    } //link scope ends
  };
}

export default googleMap;

Спасибо!

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из способов сделать это - создать информационное окно и маркер, а затем привязать событие щелчка, чтобы открыть / закрыть информационное окно -

    var marker = new google.maps.Marker({
        position: latlng,
        map: mapObject,
        title: "MARKER"
    });

    var infoWindow = new google.maps.InfoWindow({
        content: "<h1>Hello World</h1>"
    });

    google.maps.event.addListener(marker, "click", function () {

         infoWindow.open(mapObject, marker);

    });

РЕДАКТИРОВАТЬ - В вашем случае вы строите массив / список маркеров, и каждый маркер имеет собственное информационное окно, поэтому вы можете изменить код построения маркеров (результатов) на что-то вроде этого:

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

// keep reference of plotted markers, so we can clear them if required
var markers = [];

for (var i = 0; i < results.length; i++) {

    var place = results[i];

    // create marker    
    var marker = new google.maps.Marker({
      map: mapObject,
      position: place.geometry.location,
      title: place.name
    });

    // create info window
    var infoWindow = new google.maps.InfoWindow({
      content: ''
    });

    //adding an extra property to marker, (infoWindow - so we can get it inside click event of marker
    marker.infoWindow = infoWindow;

    // click event handler
    google.maps.event.addListener(marker, "click", function() {

        // this == marker 
        var map = this.infoWindow.getMap();

        if (map !== null && typeof map !== "undefined")
            this.infoWindow.close();
        else {
            // open info window at marker position
            this.infoWindow.open(mapObject, this);
        }
    });
    markers.push(marker);
}

Это прекрасно, большое спасибо, Давуд. Первое решение действительно сработало абсолютно нормально. Ваше здоровье!

Reena Verma 20.03.2018 11:15

Другие вопросы по теме