2016-03-01 36 views
0

谷歌地圖在角我用一個指令創建迷你地圖,給出的屬性latlng,自動重新定位地圖,如果這些值的變化:setCenter模態

.directive('map', function() { 
    return { 
    restrict: 'A', 
    scope: { 
     lat: '@', 
     lng: '@' 
    }, 
    link: function(scope, element, attrs){ 
     var lat = scope.$eval(attrs.lat); 
     var lng = scope.$eval(attrs.lng); 

     var center = new google.maps.LatLng(lat,lng), 

     mapOptions = { 
     zoom: 16, 
     center: center, 
     mapTypeId: google.maps.MapTypeId.ROADMAP, 
     draggable: true, 
     zoomControl: true, 
     scrollwheel: false, 
     disableDoubleClickZoom: true, 
     styles: [...], 
     disableDefaultUI: true 
     }, 
     map = new google.maps.Map(element[0], mapOptions), 
     marker = new google.maps.Marker({ 
     position: center, 
     map: map, 
     icon: { 
      url: 'img/marker.png', 
      scaledSize: new google.maps.Size(24, 32) 
     } 
     }); 

     function update() { 
     lat = scope.$eval(attrs.lat); 
     lng = scope.$eval(attrs.lng); 
     center = new google.maps.LatLng(lat,lng); 

     map.setCenter(center); 
     marker.setPosition(center); 

     console.log('updated'); 
     } 

     attrs.$observe('lat', update); 
     attrs.$observe('lng', update); 
    } 
    }; 
}) 

在使用中這樣的例子是:

<div class="smallMap" lat="49" lng="-1" map></div> 

這通常很好,但在模態中使用它時會出現問題。由於指令在模式打開之前觸發,因此在DOM中不可見。因此,setCenter不起作用(請參閱http://www.blogbyben.com/2011/12/gotcha-of-day-google-maps-setcenter.html)。

有沒有什麼辦法可以強制指令在模態打開後觸發,或者有另一種方法解決地圖在DOM中可見之前居中的問題?

+0

您是否嘗試更新調整大小事件?然後,您只需找出觸發調整大小事件的位置並找到一個乾淨的解決方案。 – Ivan

回答

0

爲了確保地圖正確定位更換線指令:

map.setCenter(center); 
marker.setPosition(center); 

google.maps.event.addListenerOnce(map, 'idle', function() { 
    map.setCenter(center); 
    //marker.setPosition(center); 
    google.maps.event.trigger(map, 'resize'); 
}); 

假設您的地圖通過AngularJS Modal directive顯示下面的例子演示瞭如何顯示谷歌模態對話框中的地圖

Codepen

+0

這不起作用,因爲地圖在它可見之前會空閒,所以你有同樣的問題。但是,地圖圖塊在可見之前不會加載,因此您可以使用「tilesloaded」事件。更新您的答案,並將其標記爲已接受。 –