最近项目接到一个需求,要求用拖拽实现在两个Panel之间实现拖拽添加和删除元素的功能.
首先想到的是EXTJS提供的View组件,View组件绑定一个Store和Template就可以得到预期的UI显示效果,再加上EXTJS提供的DD(Drag and Drop)功能,则可以实现两个View组件之前的元素拖拽添加以及删除.
效果如下:
Demo代码实例如下:
Ext.onReady(function(){ var columnData = [ ["Consignee", "1001"],["PO#", "1002"],["Cargo Origin", "1003"],["Cargo Origin Country", "1004"], ["Cargo Dest.", "1005"],["Cargo Destination Country", "1006"],["PO Status", "1007"], ["PO Vendor", "1008"],["Buyers", "1009"],["Bill to", "1010"],["Earliest Ship Date", "1011"], ["Latest Ship Date", "1012"] ]; var columnStore = new Ext.data.ArrayStore({ fields: ['fieldName','fieldOid'], data: columnData }); var selectedColumnStore = new Ext.data.ArrayStore({ fields: ['fieldName','fieldOid'], data: [] }); var columnsView = Ext.create('Ext.view.View', { store: columnStore, id: 'columnsViewOid', xtype: 'dataview', tpl: [ '<tpl for=".">', '<div class="thumb-wrap1" id="{fieldOid}">', '<div style="padding-left: 3px;">{fieldName}</div></div>', '</tpl>', '<div class="x-clear"></div>', ], trackOver: true, itemSelector: '.thumb-wrap1' }); var selectedColumnsView = Ext.create('Ext.view.View', { store: selectedColumnStore, id: 'selectedColumnsViewOid', xtype: 'dataview', tpl: [ '<tpl for=".">', '<div class="thumb-wrap1" id="{fieldOid}">', '<div style="padding-left: 3px;">{fieldName} <img border="0" src="images/del.gif" onclick = "deleteViewItem({fieldOid})"/></div></div>', '</tpl>', '<div class="x-clear"></div>', ], trackOver: true, itemSelector: '.thumb-wrap1' }); Ext.create('Ext.Panel', { id: 'columnsDispPanelOid', autoScroll:true, width: 600, height:350, renderTo: 'columnsDispPanel', bodyPadding: 5, layout:'border', defaults: { split: true }, items:[ { xtype:'panel', region:'west', margin: '0 2 0 0', flex:1, items: columnsView, tbar:[ {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'} ] }, { xtype:'panel', region:'center', items: selectedColumnsView, tbar:[ {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'}, '-', { xtype: 'button', icon: 'images/rpt_reset.png', text: 'Reset', id: 'selectedColumnResetID', textAlign: 'right', listeners:{ click: function() { Ext.getCmp('selectedColumnsViewOid').getStore().loadData([]); } } } ], } ] }); /** * Drag zone overrides */ var dragZoneOverrides = { containerScroll : true, scroll : false, getDragData : function(evtObj) { var columnsDataView = Ext.getCmp('columnsViewOid'); var sourceEl = evtObj.getTarget(columnsDataView.itemSelector, 10); if (sourceEl) { var selectedNodes = columnsDataView.getSelectedNodes(); var dragDropEl = document.createElement('div'); if (selectedNodes.length < 1) { selectedNodes.push(sourceEl); } Ext.each(selectedNodes, function(node) { dragDropEl.appendChild(node.cloneNode(true)); }); return { ddel : dragDropEl, repairXY : Ext.fly(sourceEl).getXY(), dragRecords : columnsDataView.getRecord(sourceEl), sourceDataView : columnsDataView }; } }, getRepairXY: function() { return this.dragData.repairXY; } }; var onDragZoneCfg = Ext.apply({}, { ddGroup : 'columnDDGrp', dataView : Ext.getCmp('columnsViewOid') }, dragZoneOverrides); new Ext.dd.DragZone(Ext.getCmp('columnsViewOid').getEl(), onDragZoneCfg); /** * Drop zone overrides */ var dropZoneOverrides = { onContainerOver : function() { return this.dropAllowed; }, onContainerDrop : function(dropZone, evtObj, dragData) { var selectedColumnDataView = Ext.getCmp('selectedColumnsViewOid'); var dragRecords = dragData.dragRecords; var store = selectedColumnDataView.store; var dupFound = false; Ext.each(dragRecords, function(record) { var found = store.findBy(function(r) { return r.data.fieldName === record.data.fieldName; }); if (found > -1 ) { dupFound = true; } }); if (!dupFound) { selectedColumnDataView.store.add(dragRecords.data); } else { Ext.MessageBox.alert('Warning', dragRecords.data.fieldName + ' already exist.'); } return true; } }; var onDropZoneCfg = Ext.apply({}, { ddGroup : 'columnDDGrp', dataView : Ext.getCmp('selectedColumnsViewOid') }, dropZoneOverrides); var onDropZone = new Ext.dd.DropZone(Ext.getCmp('selectedColumnsViewOid').ownerCt.el, onDropZoneCfg); deleteViewItem = function (oid) { var viewName = 'selectedColumnsViewOid'; var delItems = []; var currentSelectedColumns = Ext.getCmp(viewName).store.data.items; Ext.Array.forEach (currentSelectedColumns, function(currentSelectedColumn, index) { if (currentSelectedColumn.data.fieldOid == oid) { delItems.push(currentSelectedColumn); Ext.getCmp(viewName).store.remove(delItems); } }) } });
jsfiddle 预览: http://jsfiddle.net/8L0keqd7/
相关推荐
在ExtJS 4中实现两个GridPanel间的数据拖拽功能涉及到了ExtJS框架提供的丰富的组件和插件支持。拖拽功能让用户可以通过交互式地拖动界面元素来执行操作,如移动或复制数据项等。这里的主要知识点是使用ExtJS提供的...
Extjs4的textfield控件竟然没有tooltip悬浮提示,这应该算是个bug吧。网上查了很多,也没有方案。后来自己通过查询并整理出这个方案,终于实现了。 思想如下: 在textfield渲染时注册mouseover事件,然后在其中调用...
在 ExtJS 3 里生成表的几个框架组件,ExtJS4 大多生成 div,这使得 CSS classes 将会失败。ExtJS4 已完全重新写 grid 组件,tree 也被更新,所以从版本 3 到 4 大部分的属性改变了。 在 ExtJS4 中,API 也发生了很...
标题中的"ExtJs 实现select列表选中项时添加删除"指的是在ExtJS应用中创建一个下拉选择列表(Select List),并且当用户选择某一项时,能够执行添加或删除操作。这通常涉及到事件监听、数据模型的操作以及用户界面的...
在树和表格之间进行拖拽,我们需要配置这两个组件以支持拖放操作,并定义数据传输方式。 1. **配置DragSource**: 对于树形视图,我们需要将每个节点实例化为DragSource。这可以通过在树节点配置中指定`draggable:...
本文将深入探讨 ExtJS4.0 MVC 的核心概念、结构以及如何实现一个简单的 MVC 应用。 1. MVC 架构模式介绍 MVC 分为三个主要部分:Model(模型)、View(视图)和 Controller(控制器)。模型处理数据和业务逻辑,...
ExtJS4中可以为元素添加事件响应: - **添加单击事件响应**:通过Ext.onReady或Ext.application方法,在页面加载完毕后为DOM元素添加事件监听器,执行指定的函数。 #### 6. CSS和JavaScript引入注意事项 在ExtJS...
EXTJS4 是一款强大的JavaScript框架,用于构建富客户端Web应用程序。EXTJS4的学习文档旨在帮助开发者掌握这一框架,尤其对于初学者来说,提供了宝贵的资源。文档中包含了从环境配置到实际应用开发的基础步骤。 首先...
extjs4动态添加表头字段、删除、增加记录!
在ExtJS中,`Ext.onReady`和`Ext.application`是两个非常重要的方法。`Ext.onReady`会在DOM完全加载后自动执行,确保所有元素都可被脚本引用。你可以尝试在`Ext.onReady`函数内添加代码,例如弹出一个对话框,以观察...
总的来说,ExtJS动态树的实现和节点拖拽涉及前端和后端的多个技术层面,包括JavaScript库的使用、事件监听、数据模型的处理、与服务器的通信以及数据库操作。掌握这些技能,开发者可以创建出功能强大且用户体验优秀...
在ExtJS4中,我们可以创建一个窗体(Window)组件,并通过配置或代码实现拖动功能。窗体(Window)是ExtJS中的浮动容器,它可以自由地在页面上移动。要实现拖动效果,我们需要设置`draggable`属性为`true`。以下是一...
ExtJS 是一个流行的JavaScript框架,主要用于构建富客户端的Web应用程序。它提供了丰富的组件库、数据管理功能以及强大的用户界面(UI)元素。在标题和描述中提到的“Extjs4小图标”指的是ExtJS 4版本中使用的一系列...
本文将详细解析"ExtJS4多文件上传,带进度条及管理"这一主题,涵盖其核心概念、实现方式以及相关技术。 **一、ExtJS4概述** ExtJS4是Sencha公司推出的一个前端框架,它提供了丰富的组件库和强大的数据绑定机制,...
最近小弟做了Extjs实现实现下拉框联动的效果,参考了好久才学会,闲下来发一个简单的例子。。呵呵
ExtJS4是一个强大的JavaScript框架,主要用于构建富客户端的Web应用程序。在给定的"Extjs4 grid使用例子"中,我们可以深入理解如何在MVC架构下有效地利用ExtJS4的Grid组件。Grid组件是ExtJS中的核心部分,它提供了一...
主要的四个文件 博文链接:https://zhao103804.iteye.com/blog/1884445
在本文中,我们将深入探讨如何使用ExtJs框架实现图片的批量显示、上传和删除功能。ExtJs是一款强大的JavaScript库,专用于构建富客户端应用程序,它提供了丰富的组件和强大的数据管理能力,非常适合处理图像操作。 ...
EXTJS4是一个强大的JavaScript框架,主要用于构建富客户端Web应用程序。这个中文文档是EXTJS4的官方文档翻译版,为开发者提供了详细的API参考和教程,帮助理解EXTJS4的各种组件、功能和工作原理。 EXTJS4的核心特性...
ExtJS是一个广泛应用于Web前端开发的JavaScript框架,其主要特点是提供了丰富的组件库和高度可定制的用户界面。在本文中,我们将深入探讨ExtJS4这一版本的重要特性、改进以及它如何扩展了先前版本的功能。 首先,...