Extjs4 实现两个DataView之间元素的拖拽添加及删除

最近项目接到一个需求,要求用拖拽实现在两个Panel之间实现拖拽添加和删除元素的功能.

首先想到的是EXTJS提供的View组件,View组件绑定一个Store和Template就可以得到预期的UI显示效果,再加上EXTJS提供的DD(Drag and Drop)功能,则可以实现两个View组件之前的元素拖拽添加以及删除.

效果如下:

Extjs4 实现两个DataView之间元素的拖拽添加及删除

Demo代码实例如下:

 

  1 Ext.onReady(function(){
  2     
  3     var columnData = [  
  4         ["Consignee", "1001"],["PO#", "1002"],["Cargo Origin", "1003"],["Cargo Origin Country", "1004"],
  5         ["Cargo Dest.", "1005"],["Cargo Destination Country", "1006"],["PO Status", "1007"],
  6         ["PO Vendor", "1008"],["Buyers", "1009"],["Bill to", "1010"],["Earliest Ship Date", "1011"],
  7         ["Latest Ship Date", "1012"]
  8     ];  
  9 
 10     var columnStore = new Ext.data.ArrayStore({  
 11         fields: ['fieldName','fieldOid'],  
 12         data: columnData  
 13     });  
 14 
 15     var selectedColumnStore = new Ext.data.ArrayStore({  
 16         fields: ['fieldName','fieldOid'],  
 17         data: []  
 18     });  
 19 
 20     var columnsView = Ext.create('Ext.view.View', {
 21         store: columnStore,
 22         id: 'columnsViewOid',
 23         xtype: 'dataview',
 24         tpl: [
 25             '<tpl for=".">',
 26                 '<div class="thumb-wrap1" id="{fieldOid}">',
 27                 '<div style="padding-left: 3px;">{fieldName}</div></div>',
 28             '</tpl>',
 29             '<div class="x-clear"></div>',
 30         ],
 31         trackOver: true,
 32         itemSelector: '.thumb-wrap1'
 33     });
 34 
 35     var selectedColumnsView = Ext.create('Ext.view.View', {
 36         store: selectedColumnStore,
 37         id: 'selectedColumnsViewOid',
 38         xtype: 'dataview',
 39         tpl: [
 40             '<tpl for=".">',
 41                 '<div class="thumb-wrap1" id="{fieldOid}">',
 42                 '<div style="padding-left: 3px;">{fieldName}  <img border="0" src="images/del.gif" onclick = "deleteViewItem({fieldOid})"/></div></div>',
 43             '</tpl>',
 44             '<div class="x-clear"></div>',
 45         ],
 46         trackOver: true,
 47         itemSelector: '.thumb-wrap1'
 48     });
 49  
 50     
 51     Ext.create('Ext.Panel', {
 52         id: 'columnsDispPanelOid',
 53         autoScroll:true,
 54         width: 600,
 55         height:350,
 56         renderTo: 'columnsDispPanel',
 57         bodyPadding: 5,
 58         layout:'border',
 59         defaults: {
 60             split: true
 61         },
 62         items:[
 63             {
 64                 xtype:'panel', region:'west', margin: '0 2 0 0', flex:1, items: columnsView,
 65                 tbar:[
 66                     {xtype:'displayfield', value:'<span style="color:#04408c;font-weight:bolder;height:20px;line-height:19px;margin-left:3px"> Columns </span>', margin: '0 2 0 0'}
 67                 ]
 68             },
 69             {
 70                 xtype:'panel', region:'center', items: selectedColumnsView,
 71                 tbar:[
 72                     {xtype:'displayfield', value:'<span style="color:#04408c;font-weight:bolder;height:20px;line-height:15px;margin-left:3px"> Selected Columns </span>', margin: '0 2 0 0'},
 73                     '-',
 74                     {
 75                         xtype: 'button',
 76                         icon: 'images/rpt_reset.png',
 77                         text: 'Reset',
 78                         id: 'selectedColumnResetID',
 79                         textAlign: 'right',
 80                         listeners:{
 81                             click: function() {
 82                                 Ext.getCmp('selectedColumnsViewOid').getStore().loadData([]);
 83                             }
 84                         }
 85                    }
 86                 ],
 87             }
 88         ]
 89     });
 90 
 91 
 92     /**
 93     * Drag zone overrides
 94     */
 95     var dragZoneOverrides = {
 96         containerScroll : true,
 97         scroll          : false,
 98         getDragData     : function(evtObj) {
 99             var columnsDataView = Ext.getCmp('columnsViewOid');
100             var sourceEl = evtObj.getTarget(columnsDataView.itemSelector, 10);
101             if (sourceEl) {
102                 var selectedNodes = columnsDataView.getSelectedNodes();
103                 var dragDropEl = document.createElement('div');
104                 if (selectedNodes.length < 1) {
105                     selectedNodes.push(sourceEl);
106                 }
107                 Ext.each(selectedNodes, function(node) {
108                     dragDropEl.appendChild(node.cloneNode(true));
109                 });
110                 return {
111                     ddel           : dragDropEl,
112                     repairXY       : Ext.fly(sourceEl).getXY(),
113                     dragRecords    : columnsDataView.getRecord(sourceEl),
114                     sourceDataView : columnsDataView
115                 };
116             }
117 
118         },
119         getRepairXY: function() {
120             return this.dragData.repairXY;
121         }
122     };
123 
124 
125     var onDragZoneCfg = Ext.apply({}, {
126         ddGroup     : 'columnDDGrp',
127         dataView    : Ext.getCmp('columnsViewOid')
128     }, dragZoneOverrides);
129 
130     new Ext.dd.DragZone(Ext.getCmp('columnsViewOid').getEl(), onDragZoneCfg);
131 
132     
133     /**
134     * Drop zone overrides
135     */
136     var dropZoneOverrides = {
137         onContainerOver : function() {
138           return this.dropAllowed;
139         },
140         onContainerDrop : function(dropZone, evtObj, dragData) {
141             var selectedColumnDataView = Ext.getCmp('selectedColumnsViewOid');
142             var dragRecords = dragData.dragRecords;
143             var store = selectedColumnDataView.store;
144             var dupFound = false;
145             Ext.each(dragRecords, function(record) {
146                 var found = store.findBy(function(r) {
147                    return r.data.fieldName === record.data.fieldName;
148                 });
149                 if (found > -1 ) {
150                     dupFound = true;
151                 }
152             });
153 
154             if (!dupFound) {
155                 selectedColumnDataView.store.add(dragRecords.data);
156             } else {
157                 Ext.MessageBox.alert('Warning', dragRecords.data.fieldName + ' already exist.');
158             }
159             return true;
160         }
161     };
162 
163     var onDropZoneCfg = Ext.apply({}, {
164         ddGroup          : 'columnDDGrp',
165         dataView         : Ext.getCmp('selectedColumnsViewOid')
166     }, dropZoneOverrides);
167 
168     var onDropZone = new Ext.dd.DropZone(Ext.getCmp('selectedColumnsViewOid').ownerCt.el, onDropZoneCfg);
169 
170     deleteViewItem = function (oid) {
171         var viewName = 'selectedColumnsViewOid';
172         var delItems = [];
173         var currentSelectedColumns = Ext.getCmp(viewName).store.data.items;
174         Ext.Array.forEach (currentSelectedColumns, function(currentSelectedColumn, index) {
175             if (currentSelectedColumn.data.fieldOid == oid) {
176                 delItems.push(currentSelectedColumn);
177                 Ext.getCmp(viewName).store.remove(delItems);
178             }
179         })
180     }
181 
182 });

jsfiddle 预览: http://jsfiddle.net/8L0keqd7/

你可能感兴趣的:(Extjs4 实现两个DataView之间元素的拖拽添加及删除)