2011-12-19 134 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