2016-03-29 10 views
7

मान लीजिए मैं एक एकल पृष्ठ आवेदन (कोणीय जे एस आवेदन) है, और मुझे googleMap एलीमेंट आईडी पर एक गूगल मानचित्र उदाहरण आकर्षित -पुन: उपयोग उदाहरण

var mapInstance = new google.maps.Map(document.getElementById(`googleMap`), mapOption) 

तो मैं माध्यम से नेविगेट आवेदन रूटिंग, इस वजह से, googleMap डीओएम तत्व को नष्ट कर रहा है, और अंत में मैं इस तत्व के साथ मार्ग पर वापस आ गया हूं, अब मुझे इस तत्व पर मानचित्र को दोबारा खींचना है।

मानचित्र को फिर से निकालने का सही तरीका क्या है?

जैसा कि मैंने this answer में पढ़ा है, मुझे इसे फिर से बनाना नहीं है, लेकिन उसी उदाहरण का उपयोग करें।

उत्तर

3

इस प्रश्न में कोणीय टैग है इसलिए मुझे लगता है कि यह एक कोणीय जेएस अनुप्रयोग है। इस मामले में, आपको शायद अपने पेज नियंत्रक में ऐसा नहीं करना चाहिए।

आप https://angular-ui.github.io/angular-google-maps/#!/ जैसे पूर्व-मौजूदा निर्देश का उपयोग कर सकते हैं या आप अपना निर्देश लिख सकते हैं।

यदि आप अपना निर्देश लिखते हैं तो आपको $ scope.on ('$ dest', fn) ईवेंट का उपयोग करके निर्देश नष्ट होने पर Google मानचित्र इंस्टेंस को नष्ट करना चाहिए। जैसा इस ..

$scope.on('$destroy', function(){ 
    mapInstance = null; 
}) 
+0

यीप, यह कोणीय जे एस आवेदन – URL87

+0

एक मामले मैं अपने खुद के निर्देश बारे में है, मैं में क्या करना है '$ नष्ट' समारोह और इसे कैसे निकालना है? – URL87

+0

मैंने अपना जवाब अपडेट किया है कि इसे कैसे नष्ट किया जाए।मुझे यकीन नहीं है कि आपको इसे फिर से आकर्षित करने की आवश्यकता क्यों है क्योंकि यह डीओएम से जुड़ा हुआ है। जब नया निर्देश संकलित किया जाता है तो बस एक नया नक्शा बनाएं। – jonhobbs

2

मैं

$scope.on('$destroy', function(){ 
    mapInstance = null; 
}) 

के साथ सावधान मैं एक निर्देश मेरी नक्शा डोम तत्व से युक्त था, और dataLayer से सभी नक्शे संदर्भ हटाने के लिए इस विधि बुला रहा था हो सकता है, सभी श्रोताओं, और उसके बाद मानचित्र को शून्य पर सेट करें। मैं पृष्ठ नेविगेशन के बीच ढेर की जांच कर रहा था और नक्शा उदाहरण नया बनाया जा रहा था, लेकिन पुराना नक्शा अभी भी ढेर में था जो हमेशा स्मृति उपयोग में वृद्धि करता था।

इसके अलावा आपके द्वारा लिंक किया गया उत्तर भी इसे हटाने का प्रयास करने के बजाय अपने मानचित्र उदाहरण का पुन: उपयोग करने की अनुशंसा करता है। Google मानचित्र डेवलपर्स भी इस दृष्टिकोण की अनुशंसा करते हैं। मैंने जो समाधान पाया वह आपके निर्देश तत्व को किसी सेवा में पास करना था, और उस बच्चे के तत्व को जोड़ना था जिससे नए बच्चे तत्व पर नक्शा बनाया जा सके। यदि नक्शा पहले से मौजूद है, तो नक्शा div को निर्देश तत्व में संलग्न करें। नीचे मेरा कोड है।

एनजी-व्यू तत्व

<map-container></map-container> 

निर्देशक

angular.module('project') 
    .directive('mapContainer', function($timeout, mapService) { 
    return { 
     template: '<div></div>', 
     restrict: 'E', 
     replace: true, 
     link: function(scope, element) { 
     $timeout(function() { 
      //Use the $timeout to ensure the DOM has finished rendering 
      mapService.createMap(element).then(function() { 
       //map now exists, do whatever you want with it 
      }); 
     }); 
     } 
    }; 
}) 

सेवा

angular.module('project') 
    .service('mapService', function($q) { 

    var lat = -33.1798; 
    var lng = 146.2625; 
    var minZoom = 5; 
    var maxZoom = 20; 
    var zoom = 6; 
    var mapOptions = null; 
    var map = null; 

    function initialiseGmap(element) { 

     return $q(function (resolve) { 
     if (map) { 
      //Map already exists, append it 
      element.append(map.getDiv()); 
      resolve(); 
     } else { 
      //No map yet, create one 
      element.append('<div id="map_canvas"></div>'); 

      mapOptions = { 
      zoom: zoom, 
      center: new google.maps.LatLng(lat, lng), 
      styles: hybridMap, //your style here 
      minZoom: minZoom, 
      maxZoom: maxZoom, 
      mapTypeId: google.maps.MapTypeId.ROADMAP, 
      mapTypeControl: false, 
      streetViewControl: false, 
      panControl: false, 
      scaleControl: true, 
      zoomControl: false 
      }; 

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

      //create any map listeners you want here. If you want to add data to the map and add listeners to those, I suggest a seperate service. 

      resolve(); 
     } 
     }); 
    } 

    return { 
     createMap: function(elem) { 
     return initialiseGmap(elem); 
     }, 
     getMap: function() { 
     return map; 
     }, 
     //Create as many functions as you like to interact with the map object 
     //depending on our project we have had ones to interact with street view, trigger resize events etc etc. 
     getZoom: function() { 
     return zoom; 
     }, 
     setZoom: function(value) { 
     map.setZoom(zoom); 
     } 
    }; 
    }); 
0

मेरे मामले में मदद की फिर से init टाइमआउट के साथ Google मानचित्र के ialization ने इस मुद्दे को हल किया।

setTimeout(function(){ initialize() }, 30); 

पहले से बनाए गए डायनामिक तत्व को नष्ट करके initialized उदाहरण संभव हत्या, लेकिन यह कठिन है ...

संबंधित मुद्दे