在element dialog中使用天地圖報錯Error in v-on handler: "TypeError: Cannot read property '_tdt_events' of null"


首先在html中需要有一個實例對象元素

<div id="mapDiv"></div>

然后在data中定義三個變量用於存儲地圖實例和經緯度

data(){
  map:null,
  currentLng:116.4,
  currentLat:39.9,
}
 
初始化天地圖
initMap(){
      //初始化地圖對象
      if(!this.map){        //此判斷因為map實例會被重復創建所以需要使用最新實例(這一判斷其實我之前也想過,因為我是需要顯示在dialog彈窗中,在取消關閉彈窗的時候將map變量實例置空,但再次打開彈窗,實際效果並未拿到最新實例,並且地圖無法拖動,結果請求大佬之后才知道需要此判斷)
          var marker;       //如果不加此判斷,每次打開地圖地圖實例和覆蓋物會被重復創建,會造成頁面覆蓋物重復並且地圖無法拖動問題(因為鄙人使用是在element dialog框中,所以每次打開需重復創建實例,直接顯示在頁面中好像不會出現問題,各位可自行嘗試)
          var zoom = 16;
          this.map = new T.Map("mapDiv");
      }
      this.map.clearOverLays();           // 清除地圖中的覆蓋物(因為實例和覆蓋物會被重復創建最新的,所以在最新的生成前需要清除掉之前的)
      //設置顯示地圖的中心點和級別
      this.map.centerAndZoom(new T.LngLat(this.currentLng, this.currentLat), zoom);
      var point = new T.LngLat(this.currentLng,this.currentLat);
      marker = new T.Marker(point);// 創建標注
      this.map.addOverLay(marker);             // 將標注添加到地圖中
      marker.enableDragging();           // 可拖拽
      marker.addEventListener("dragend",this.dragMarker)    //此處為覆蓋物添加拖拽事件,更多事件參照官網http://lbs.tianditu.gov.cn/api/js4.0/class.html
    },
監聽拖拽事件
dragMarker(e){
      var current = e.target
      if(current instanceof T.Marker){
   console.log(current.getLngLat().lng)    //拖拽完后獲取到經緯度之后你就可以開始自己的業務邏輯操作了
   console.log(current.getLngLat().lat)
      }else{
          console.log("無法獲取該坐標位置");
      }
},
 
重點來了!!!↓ ↓ ↓
當我們調用地圖時需要使用 setTimeout做延遲
getMap() {
      setTimeout(()=>{
          this.initMap()
      },100)
},
鄙解(鄙人理解):因為業務需要,需要將地圖顯示在彈窗中,elment diaplog的原理是通過v-if來實現的,需要重復的創建刪除節點,當打開彈窗的一瞬間就調用地圖實例,但彈窗中的dom元素還未生成,所以未獲取到dom實例。
上面只是個人理解,對錯未知,如有大佬懂之,並為之糾錯,吾謝之!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM