EXTJS DataView 元素排序事例

Extjs的DataView组件似乎没有排序的功能(针对View中的Item进行拖拽实现位置变化来达到排序的目的),下面的代码实现则是对这个功能的补充:

1. 拖拽任意的ITEM来实现位置切换(如将ITEMA拖至ITEMB上方,然后放开,则ITEMA会插入到ITEMB的前面一个位置)。

2. 如果将一个ITEM拖放的位置不是在某个ITEM的区域,而是空白的某个区域,则这个ITEM会自动排到最后一个位置。

3. ToolBar中的reset是对view中的所有ITEM按照首字母的升序排列。

拖放前:

将PO#放在第一位,然后将Consignee拖放至最后一位:

点击reset进行升序排列:

 

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 columnsView = Ext.create('Ext.view.View', {
 16         store: columnStore,
 17         id: 'columnsViewOid',
 18         xtype: 'dataview',
 19         layout:'fit',
 20         tpl: [
 21             '<tpl for=".">',
 22                 '<div class="thumb-wrap1" id="{fieldOid}">',
 23                 '<div style="padding-left: 3px;">{fieldName}</div></div>',
 24             '</tpl>',
 25             '<div class="x-clear"></div>',
 26         ],
 27         trackOver: true,
 28         itemSelector: '.thumb-wrap1'
 29     });
 30 
 31     Ext.create('Ext.Panel', {
 32         id: 'columnsDispPanelOid',
 33         autoScroll:true,
 34         width: 850,
 35         height:150,
 36         renderTo: 'columnsDispPanel',
 37         bodyPadding: 5,
 38         defaults: {
 39             split: true
 40         },
 41         items: columnsView, 
 42         tbar:[
 43             {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'},
 44             '-',
 45             {
 46                 xtype: 'button',
 47                 icon: 'images/rpt_reset.png',
 48                 text: 'Reset',
 49                 id: 'selectedColumnResetID',
 50                 textAlign: 'right',
 51 
 52                 listeners:{
 53                     click: function() {
 54                         Ext.getCmp('columnsViewOid').getStore().sort('fieldName', 'ASC');
 55                     }
 56                 }
 57            }
 58         ]
 59     });
 60 
 61 
 62     /**
 63     * Drag zone overrides
 64     */
 65     var dragZoneOverrides = {
 66         containerScroll : true,
 67         scroll          : false,
 68         getDragData     : function(evtObj) {
 69             var columnsDataView = Ext.getCmp('columnsViewOid');
 70             var sourceEl = evtObj.getTarget(columnsDataView.itemSelector, 10);
 71             if (sourceEl) {
 72                 var selectedNodes = columnsDataView.getSelectedNodes();
 73                 var dragDropEl = document.createElement('div');
 74                 if (selectedNodes.length < 1) {
 75                     selectedNodes.push(sourceEl);
 76                 }
 77                 Ext.each(selectedNodes, function(node) {
 78                     dragDropEl.appendChild(node.cloneNode(true));
 79                 });
 80                 return {
 81                     ddel           : dragDropEl,
 82                     repairXY       : Ext.fly(sourceEl).getXY(),
 83                     dragRecords    : columnsDataView.getRecord(sourceEl),
 84                     sourceDataView : columnsDataView
 85                 };
 86             }
 87 
 88         },
 89         getRepairXY: function() {
 90             return this.dragData.repairXY;
 91         }
 92     };
 93 
 94 
 95     var onDragZoneCfg = Ext.apply({}, {
 96         ddGroup     : 'columnDDGrp',
 97         dataView    : Ext.getCmp('columnsViewOid')
 98     }, dragZoneOverrides);
 99 
100     new Ext.dd.DragZone(Ext.getCmp('columnsViewOid').getEl(), onDragZoneCfg);
101 
102     
103     /**
104     * Drop zone overrides
105     */
106     var dropZoneOverrides = {
107         onContainerOver : function() {
108           return this.dropAllowed;
109         },
110         onContainerDrop : function(dropZone, evtObj, dragData) {
111             var dataView = Ext.getCmp('columnsViewOid');
112             var dragRecords = dragData.dragRecords;
113             var store = dataView.store;
114             dataView.store.removeAt(dataView.store.find('fieldOid', dragRecords.data.fieldOid));
115             if (evtObj.getTarget(dataView.itemSelector, 10)) {
116                 dataView.store.insert(evtObj.getTarget(dataView.itemSelector, 10).viewIndex, dragRecords.data);
117             } else {
118                 dataView.store.insert(dataView.store.count(), dragRecords.data);
119             }
120             return true;
121         }
122     };
123 
124     var onDropZoneCfg = Ext.apply({}, {
125         ddGroup          : 'columnDDGrp',
126         dataView         : Ext.getCmp('columnsViewOid')
127     }, dropZoneOverrides);
128 
129     var onDropZone = new Ext.dd.DropZone(Ext.getCmp('columnsViewOid').ownerCt.el, onDropZoneCfg);
130 
131 });
View Code

 

转载于:https://my.oschina.net/gagabear/blog/316294

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值