0

GoogleマップV3 APIに問題があります。データをリロードするときにGoogleマップマーカーを削除できません。

は、ここに私のAngularJS指令です:あなたは私が私のロジックが間違っているかを確認するconsole.logsに夢中してきた見ることができるように

; 
(function() { 
"use strict"; 

angular.module('LoVendoApp.directives') 
    .directive('map', ['SimpleRETS', 'InfoWindowService', 'McOptions', 'ModalOptions', '$rootScope', '$parse', '$uibModal', '$timeout', 'SafetyFilter', 
     function (SimpleRETS, InfoWindowService, McOptions, ModalOptions, $rootScope, $parse, $uibModal, $timeout, SafetyFilter) { 
      return { 
       restrict: 'A', 
       scope: { 
        requestObj: '=' 
       }, 
       link: function (scope, el, attrs) { 
        //Creating map instance with GoogleMaps API 
        var map = new google.maps.Map(el[0], { 
         center: { 
          lat: 25.7742700, 
          lng: -80.1936600 
         }, 
         zoom: 8 
        }); 

        //Markers array 
        var markers = []; 
        console.log('on init = ', markers.length); 

        /** 
        * Creates new google maps 
        * marker 
        * 
        * @param {Object} param 
        * 
        */ 

        function _newGoogleMapsMarker(param) { 
         var r = new google.maps.Marker({ 
          map: param._map, 
          position: new google.maps.LatLng(param._lat, param._lng), 
          title: param._head, 
          icon: param._icon 
         }); 
         if (param._data) { 
          google.maps.event.addListener(r, 'click', function() { 
           // this -> the marker on which the onclick event is being attached 
           if (!this.getMap()._infoWindow) { 
            this.getMap()._infoWindow = new google.maps.InfoWindow(); 
           } 
           this.getMap()._infoWindow.close(); 
           var content = InfoWindowService.getContent(param._data); 

           this.getMap()._infoWindow.setContent(content); 
           //Creates event listener for InfoWindow insances 
           google.maps.event.addListener(this.getMap()._infoWindow, 'domready', function() { 
            $("#iw_container") 
             .off("click") 
             .on("click", modalListener); 
            //Opens modal when click is listened 
            function modalListener() { 
             var modalOptions = ModalOptions.getHouseDetailOptions(param._data); 
             var modalInstance = $uibModal.open(modalOptions); 
            } 
           }); 
           this.getMap()._infoWindow.open(this.getMap(), this); 
          }); 
         } 
         return r; 
        } 
        //Handling request with SimpleRETS service factory 
        scope.$on('loadMap', function() { 
         SimpleRETS.requestHandler(scope.requestObj).then(dataReceived, dataError); 

         function dataReceived(res) { 
          if (markers.length > 0) { 
           for (var k = 0; k > markers.length; k++) { 
            markers[k].setMap(null); 
            console.log('removing! #', k); 
           } 
           markers = []; 
           console.log('removed!'); 
          } 
          var results = res.filter(SafetyFilter.filterData); 
          $rootScope.globalHousesData = results; 
          if (markers.length == 0) 
           $timeout(loadMarkers(results), 1000); 
         } 

         function dataError(error) { 
          console.log('mapError', error); 
         } 

        }); 
        //Randomizes position for matching coordinates 
        function randomPos() { 
         return Math.random() * (0.0001 - 0.00005) + 0.00005; 
        } 

        function loadMarkers(results) { 
         // Fetching marker options from service 
         var options = McOptions.getOptions; 
         for (var i = 0; i < results.length; i++) { 
          var marker = _newGoogleMapsMarker({ 
           _map: map, 
           _icon: 'assets/images/icon.png', 
           _lat: results[i].geo.lat, 
           _lng: results[i].geo.lng, 
           _head: '|' + new google.maps.LatLng(results[i].geo.lat, results[i].geo.lng), 
           _data: results[i] 
          }); 
          markers.push(marker); 
         } 
         var markerCluster = new MarkerClusterer(map, markers, options); 
        } 
        //Initializes event to load m 
        scope.$broadcast('loadMap'); 
       } 
      } 
     } 
    ]); 

})(); 

。それは圧倒的に見えるかもしれませんが、私は単に4つの主要なコンポーネントまたはアクションを持っています。第一私は、マップを初期化します。

var map = new google.maps.Map(el[0], { 
     center: { 
      lat: 25.7742700, 
      lng: -80.1936600 
     }, 
     zoom: 8 
    }); 

ザ・私は、マーカー配列をインスタンス化:var markers = [];

は、その後、私は2つの主要な機能を持っています。 _newGoogleMapMarkers(param)

この関数は、基本的に地図オブジェクト、位置座標、アイコン、タイトル、InfoWindowで利用できるいくつかのコンテンツを含むparamオブジェクトを取ります。また、私のアプリで外部モーダルを開くために、すべてのInfoWindowsにonClickリスナーをアタッチしています。

他の機能のマーカー配列が空であり、それは私が(SimpleRETS)を使用していた外部APIから新しいデータをロードしたときにトリガされなければならない

これは、すべてのイベント `$によってトリガされますフィルタが変更されるたびにトリガされる$ broadcast( 'loadMap')、ユーザが何らかのものと対話するなど

問題は、マーカー配列が空のときにloadMarkers()関数を呼び出すことですイテレーションしてマーカー[k] .setMap(null)を実行した後)、古いマーカーはマップに残り、各荷物に500個のマーカーを装填すると、大量のマーカーが詰まる。私は、マーカ配列が空になってから次のロードの前に1000msのタイムアウトを設定しようとしても、それが何らかの助けになるかどうかを確認しようとしましたが、そうではありません。

あなたはどう思いますか?私はあなたが持っているかもしれない提案を感謝します。

答えて

0

同じ問題が発生している可能性のある人。 markerclusterer jQuery Pluginを使用している場合は、新しいマーカーの読み込み後にマーカー配列を空にする前にmarkerCluster.clearMarkers();にする必要があります。

だから、基本的に、それはあなたがマーカーの明らかであるデータを取得し、地図上のこの時点から以降、マーカーを交換する必要があるものは何でも、あなたはどうなるこの

if (markerCluster) { 
    markerCluster.clearMarkers(); 
    markers = []; 
} 

//Load new markers in the markers array 
[...] 
//Creating Cluster 
markerCluster = new MarkerClusterer(map, markers, options); 

のようなものを探して終わるだろうとクラスタ。

関連する問題