想要实现的是: 新增、修改窗口的坐标输入框每次鼠标点击弹出一个Extjs4的地图标注窗口,这个窗口可以标注地点,标注完弹出气泡,气泡中可以点击“确定”按钮,窗口关闭,标注地点的坐标显示在坐标输入框内。

 1、   地图标注窗口中设了个叫mapbar的div,maplet初始化在这个div里面,标注,弹出气泡,点击确定,窗口关闭(destroy),坐标获取成功。第一遍很好用。

   但如果再点击坐标输入框重新create一个地图标注窗口的话,地图就不显示了。因为新窗口的mapbar的div跟上次地图初始化时的maabar Div已经不是同一个dom了。

   而mapbar在一个页面中又只能初始化一次。

失败。

 2、将窗口的关闭改为hide事件。 Ext2中貌似是可以的,但是4中不行,只有窗口隐藏了,地图层还留在页面上。

失败。

 

3、所有把前一个div隐藏,在一个新的div上再初始化maplet的尝试在方向上就是错误的。因为mapbar在一个页面内只能初始化一次。Extjs的窗口只是一个层,而不是一个页面。根本不能再初始化了,即使换了一个div。

失败。

4、只能改变实现思路了,新增、修改窗口的坐标输入框每次鼠标点击打开一个地图标注页面。

节后尝试。

 

 

经再三思量,只有通过hide窗口的方式可行,经再三尝试,爷弄成功了!

 首先,

   
   
   
   
  1.                             xtype:'triggerfield'
  2.                             name:'poilocate'
  3.                             id:'locate'
  4.                             fieldLabel:'坐标'
  5.                             labelAlign: 'right'
  6.                             labelWidth: 80, 
  7.                             width:260, 
  8.                             allowBlank: false
  9.                             onTriggerClick: function(){ 
  10.                                 if(!window.maplet)//没有初始化过地图标注窗口 
  11.                                     Ext.create('MyApp.views.map.MapmarkWindow').show(); 
  12.                                 else 
  13.                                     Ext.getCmp('MapmarkWindow').show(); 
  14.                             }, 
  15.                             selectOnFocus: true 
  16.                         }, 

MapmarkWindow.js

   
   
   
   
  1. Ext.define('MyApp.views.map.MapmarkWindow', { 
  2.     extend: 'Ext.window.Window'
  3.  
  4.     id:'MapmarkWindow'
  5.     draggable: true
  6.     height: 500, 
  7.     width:  700, 
  8.     resizable: false
  9.     layout:  'fit'
  10.     bodyStyle: 'padding:5px;'
  11.     closeAction: 'hide'
  12.     title: '标注点'
  13.     modal: true
  14.     plain: true
  15.     html:"
",//或form形式也可以 
  • //    items: [ 
  • //              { 
  • //                  id:"mapbar", 
  • //                  xtype:'form', 
  • //                } 
  • //            ] 
  •     listeners : { 
  •         scope : this
  •         'show' : function() { 
  •             var latlon = Ext.getCmp('locate').getValue();//输入框的坐标值 
  •             if(maplet==null){//没有初始化过地图 
  •                 maplet = new Maplet("mapbar"); 
  •                 maplet.addControl(new MStandardControl()); 
  •                 maplet.centerAndZoom(new MPoint(116.38672,39.90805),11); 
  •                 getpoint(); 
  •             }else
  •         //      Ext.getCmp('mapbar').show(); 
  •                 document.getElementById('mapbar').style.display="block"; //至关重要,要把隐藏的这个节点也显示了。否则窗口显示了地图层还是不显示
  •                 if(latlon==""
  •                     getpoint(); 
  •                 else{//修改标注地点 
  •                     maplet.centerAndZoom(new MPoint(latlon),11); 
  •                     maplet.setMode("pan");   
  •                     overlayEdit = addEditPoint(latlon); 
  •                 } 
  •             } 
  •         }, 
  •         'hide' : function(cmp) { 
  •             if (window.maplet) { 
  •                 window.maplet.clearOverlays(true); 
  •             } 
  •             Ext.getCmp('MapmarkWindow').hide(); 
  •         //  Ext.getCmp('mapbar').hide(); 
  •             document.getElementById('mapbar').style.display="none"; //至关重要,要把这个节点也隐藏了,否则窗口关闭了地图层还显示
  •         } 
  •     } 
  • }); 
  •  
  • //设置地图监听 
  • function getpoint(){ 
  •     maplet.setCursorIcon(photo); 
  •     MEvent.addListener(maplet,"bookmark",bookmark_done);  
  •     maplet.setMode("bookmark"); 
  •     MEvent.addListener(maplet, "edit"function(thismaplet){ 
  •             thismaplet.setEditable(true);  
  •     }); 
  •  
  • //标注触发 
  • function bookmark_done(data) { 
  •     var point = data.point.getPid(); 
  •     maplet.setMode("pan");   
  •     overlayEdit = addEditPoint(point); 
  •  
  • //添加可编辑的标注点 
  • function addEditPoint(latlon) { // 创建标注点。不居中,有标签,可以移动。] 
  •     var point = new MPoint(latlon); // 定义标注点坐标中心。 
  •     var icon = new MIcon(photo, 20, 30,10,29); // 定义标注点图标文件。 
  •     var infowindow = new MInfoWindow("确认标注", content);     
  •     var marker = new MMarker(point, icon,infowindow); // 创建一个标注点对象实例。 
  •     marker.setEditable(true); 
  •     maplet.addOverlay(marker); // 将标注点添加到地图表面。 
  •     MEvent.addListener(marker, "click"function(thismarker) {   
  •           thismarker.openInfoWindow(); 
  •     }); 
  •     MEvent.addListener(marker, "drag"function(thismarker) {   
  •           thismarker.openInfoWindow(); 
  •     });  
  •     MEvent.addListener(marker, "mouseout"function(thismarker) {   
  •           thismarker.openInfoWindow(); 
  •     });  
  •     MEvent.addListener(marker, "mouseover"function(thismarker) {   
  •           thismarker.openInfoWindow(); 
  •     }); 
  •     return marker; 
  • 全局变量和方法:

       
       
       
       
    1. //地图标注全局变量 
    2. var overlayEdit = null
    3. var maplet = null
    4. var photo ="../p_w_picpaths/houtai/green.gif"
    5. var content ="
      " + 
    6.         "确定" + 
    7.         "