2011-12-19 207 views
2

此代码工作在ExtJS的4.0.2a 但是当转换为4.1它不再起作用,并给出了一个错误面板拖放不工作的ExtJS 4.1

Uncaught TypeError: Cannot call method 'query' of undefined

Ext.onReady(function() { 

    var panel = new Ext.Panel({ 
     renderTo: divtag, 
     draggable: { 
      insertProxy: false, 
      onDrag: function(e) { 
       var el = this.proxy.getEl(); 
       this.x = el.getLeft(true); 
       this.y = el.getTop(true); 
      }, 
      endDrag: function(e) { 
       this.panel.setPosition(this.x, this.y); 
      } 
     }, 
     title: 'Panel', 
     width: 200, 
     height: 100, 
     x: 20, 
     y: 20 
    }); 
}); 
+0

我尝试下面的代码与组件,但不与面板工作正常:(并抛出错误:未捕获类型错误:对象[对象的对象]无方法“ensureAttachedToBody” 'Ext.onReady(函数(){ \t新Ext.Component({ \t \t约束:真, \t \t标题: '测试', \t \t浮动:真实, \t \t风格:{ \t \t \t的backgroundColor: '#FFF', \t \t \t边界: '1px的实心黑色' \t \t}, \t \t HTML: '标题

内容

', \t \t可拖动:{ \t \t \t \t \t \t委托:this.body \t \t} \t})显示(); });' – Shruti 2011-12-23 05:58:14

回答

3

显然这个版本的Ext有一个bug。如果您尝试默认D'n'D对于面板这样它不会工作,甚至:

Ext.onReady(function() { 
    var panel = new Ext.Panel({ 
     renderTo: 'divtag', 
     draggable: true, 
     title: 'Panel', 
     width: 200, 
     height:100, 
     x: 20, 
     y: 20 
    }); //panel.show(); }); 
}); 

我MENAGE修补代码工作,你想要的方式,此代码应工作:

Ext.onReady(function() { 
    var panel = new Ext.Panel({ 
     renderTo: 'divtag', 
     draggable: { 
      insertProxy: false, 
      onDrag: function(e) { 
       var el = this.proxy.getEl(); 
       this.x = el.getX(); 
       this.y = el.getY(); 
      }, 
      endDrag: function(e) { 
       panel.setPosition(this.x,this.y); 
      }, 
      alignElWithMouse: function() { 
       panel.dd.superclass.superclass.alignElWithMouse.apply(panel.dd, arguments); 
       this.proxy.sync(); 
      } 
     }, 
     title: 'Panel', 
     width: 200, 
     height:100, 
     x: 20, 
     y: 20 
    }); //panel.show(); }); 
}); 

作为一个方面说明,我应该建议你不要这么做,因为你可以定义你自己的可以使用的面板的DD,甚至更好的Ext已经定义了一个,所以你可以覆盖Ext面板来使用默认的Ext.util.ComponentDragger ,或者在代码中,我建议你这样做:

Ext.override(Ext.panel.Panel, { 
    initDraggable: function() { 
     var me = this, 
      ddConfig; 

     if (!me.header) { 
      me.updateHeader(true); 
     } 

     if (me.header) { 
      ddConfig = Ext.applyIf({ 
       el: me.el, 
       delegate: '#' + me.header.id 
      }, me.draggable); 

      // Add extra configs if Window is specified to be constrained 
      if (me.constrain || me.constrainHeader) { 
       ddConfig.constrain = me.constrain; 
       ddConfig.constrainDelegate = me.constrainHeader; 
       ddConfig.constrainTo = me.constrainTo || me.container; 
      } 

      me.dd = Ext.create('Ext.util.ComponentDragger', this, ddConfig); 
      me.relayEvents(me.dd, ['dragstart', 'drag', 'dragend']); 
     } 
    } 
}); 
var panel = Ext.create('Ext.panel.Panel', { 
    id: 'test', 
    renderTo: 'divtag', 
    draggable: true, 
    floating: true, 
    title: 'Panel', 
    width: 200, 
    height:100, 
    x: 20, 
    y: 20 
}); 

面板覆盖中initDraggable功能的代码取自当前稳定版本的Ext.window.Window.initDraggable方法。

+0

日Thnx完美的作品很好.. – Shruti 2011-12-28 04:07:39

+0

我很高兴我能帮助:) – sbgoran 2011-12-28 07:50:23

2

我能得到它在4.1的工作:你必须增加围绕renderTo元素的id报价,如:

renderTo : 'divtag', 

没有它正在寻找一条u报价名为divtag的ndefined变量。

一旦我跑了,我没有错误,然后我只是panel.show()来渲染它。

+0

我试过代码,因为你说...在这里它是但仍然显示相同的错误:'Ext.onReady(函数(){ 变种面板=新Ext.Panel({ \t renderTo: 'divtag', 拖动:{ insertProxy:假, ondrag当:功能(E){ \t的console.log(本); VAR EL = this.proxy.getEl(); \t this.x = el.getX(); this.y = el.getY(); \t }, endDrag:function(e){ \t panel.setPosition(this.x,this.y); } }, title:'Panel', width:200, height:100, x:20, y:20 }); }); ' – Shruti 2011-12-22 04:14:23

+0

Gotcha - 听起来像引号divtag是一个问题,但不是* *问题在这里。很高兴看到选择的答案奏效。 – 2012-01-03 15:12:57

0

只是一个建议:一个窗口组件是一个专门的面板,有一个浮动混合 - 可能是你所需要的。

+0

thnx @ dmitry ..问题是窗口允许从标题/标题拖动..我不能从窗体拖动它的身体..但如果我已经描述过,在extjs 4.0.2a工作,我能够从面板拖动... – Shruti 2011-12-22 06:39:41

+0

你有在你的html中定义的'divtag'吗?这里 – dbrin 2011-12-22 06:43:14

+0

yes为代码:' <脚本类型= “文本/ JavaScript的”> Ext.onReady(函数(){ 变种面板=新Ext.Panel({ \t renderTo: 'divtag', \t 可拖动:{ insertProxy:假, ondrag当:功能(E){ \t 变种EL = this.proxy.getEl(); \t this.x = el.getX(); this.y = el.getY (); \t}, endDrag:function(e){ \t panel.setPosition(this.x,this.y); } }, 标题: '面板', 宽度:200,高度 :100, X:20, Y:20 }); //panel.show(); });

' – Shruti 2011-12-22 07:05:19