我需要爲Ext Window實現放置目標。窗口可以放在任何地方,但當它們被放入DropZone內時,我需要調用一個函數來改變它的佈局。問題是不會調用放置事件。DropTarget Ext Window
下面是如何定義的放置目標(它是一個浮動面板,下面稱爲initComponent代碼):
this.on('render', function(w) { w.dropTarget = Ext.create('Ext.dd.DropTarget', w.getEl()); w.dropTarget.nofifyDrop = function(source, evt, data) { console.log('notifyDrop'); }; w.dropTarget.notifyEnter = function() { console.log('notifyEnter'); }; },this);
下面是如何定義放置源。當窗口具有可拖動的配置,然後它有一個我試圖配置
listeners:{ scope:this, close:function(w) { this.removeWindow(w); }, show:function(w) { console.log('win', w.dd); w.dd.afterValidDrop = function() { console.log('after valid drop'); } w.dd.onDragDrop = function() { console.log('on drag drop'); } w.dd.onStartDrag = function() { console.log('starting drag'); } },
DD財產的問題是,沒有一個函數被調用,沒有動作登錄到控制檯。當我從窗口切換到具有浮動和可拖動配置的面板時,則會調用DropTarget中的事件(notifyDrop和notifyEnter),但面板事件不會。如何正確配置拖動&拖放窗口可拖動配置或者有更好的方式來實現我所需要的。
我也試圖爲窗口或面板禁用拖動和指定的DropTarget和DragSource上自己:
的DropTarget現在有ddGroup:
this.on('render', function(w) { w.dropTarget = Ext.create('Ext.dd.DropTarget', w.getEl(),{ ddGroup:'winDDGroup', notifyDrop:function(source, evt, data) { }, notifyEnter:function() { console.log('notifyEnter'); } }); },this);
並拖動源(分機窗口):
var overrides = { startDrag: function(e) { console.log('starting drag'); //shortcut to access our element later if (!this.el) { this.el = Ext.get(this.getEl()); } //add a css class to add some transparency to our div this.el.addCls('selected'); //when we drop our item on an invalid place we need to return it to its initial position this.initialPosition = this.el.getXY(); }, onDrag: function(e) { //this.el.moveTo(e.getPageX() - 32, e.getPageY() - 32); }, onDragEnter: function(e, id) { console.log('onDragEnter', id); Ext.fly(id).addCls('valid-zone'); }, onDragOver: function(e, id) { console.log('onDragOver', id); Ext.fly(id).addCls('valid-zone'); }, onDragOut: function(e, id) { console.log('onDragOut'); }, onDragDrop: function(e, id) { console.log('on drag Drop'); // change the item position to absolute this.el.dom.style.position = 'absolute'; //move the item to the mouse position this.el.moveTo(e.getPageX() - 32, e.getPageY() - 32); Ext.fly(id).removeCls('valid-zone'); }, onInvalidDrop: function() { console.log('invalid drop'); this.el.removeCls('valid-zone'); //this.el.moveTo(this.initialPosition[0], this.initialPosition[1]); }, endDrag: function(e, id) { console.log('end drag'); this.el.removeCls('selected'); //Ext.fly(id).removeCls('drop-target'); //this.el.highlight(); } }; .... listeners:{ scope:this, close:function(w) { this.removeWindow(w); }, render:function(w) { var dd = Ext.create('Ext.dd.DragSource', w.getEl(), { ddGroup:'winDDGroup', //isTarget: false }); Ext.apply(dd, overrides); }, }
現在,當我開始拖動窗口事件被觸發但拖動窗口拖放區域沒有任何效果。 DropTarget事件不會被解僱。
編輯:當我再次從窗口切換到面板然後從源和目標事件被觸發。我仍然需要拖動來源是窗口。
它不適用於Windows。覆蓋默認的win.dd會禁止拖動窗口組件。我會深入研究它。現在,我最終使用了dragstart和dragend事件,這些事件在Ext.window中沒有記錄,但窗口使用了Ext.util.ComponentDragger。窗口本身正在發射/冒泡這些事件。 – patryks 2014-10-28 22:56:15