`
gagapear
  • 浏览: 9941 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

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

阅读更多

最近项目接到一个需求,要求用拖拽实现在两个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/

分享到:
评论

相关推荐

    Extjs4实现两个GridPanel之间数据拖拽功能具体方法

    在ExtJS 4中实现两个GridPanel间的数据拖拽功能涉及到了ExtJS框架提供的丰富的组件和插件支持。拖拽功能让用户可以通过交互式地拖动界面元素来执行操作,如移动或复制数据项等。这里的主要知识点是使用ExtJS提供的...

    Extjs4添加tooltip

    Extjs4的textfield控件竟然没有tooltip悬浮提示,这应该算是个bug吧。网上查了很多,也没有方案。后来自己通过查询并整理出这个方案,终于实现了。 思想如下: 在textfield渲染时注册mouseover事件,然后在其中调用...

    extJs3升级extjs4方案

    在 ExtJS 3 里生成表的几个框架组件,ExtJS4 大多生成 div,这使得 CSS classes 将会失败。ExtJS4 已完全重新写 grid 组件,tree 也被更新,所以从版本 3 到 4 大部分的属性改变了。 在 ExtJS4 中,API 也发生了很...

    ExtJs 实现select列表选中项时添加删除

    标题中的"ExtJs 实现select列表选中项时添加删除"指的是在ExtJS应用中创建一个下拉选择列表(Select List),并且当用户选择某一项时,能够执行添加或删除操作。这通常涉及到事件监听、数据模型的操作以及用户界面的...

    Ext实现的拖拽树和表格之间的拖拽

    在树和表格之间进行拖拽,我们需要配置这两个组件以支持拖放操作,并定义数据传输方式。 1. **配置DragSource**: 对于树形视图,我们需要将每个节点实例化为DragSource。这可以通过在树节点配置中指定`draggable:...

    extjs4MVC实现

    本文将深入探讨 ExtJS4.0 MVC 的核心概念、结构以及如何实现一个简单的 MVC 应用。 1. MVC 架构模式介绍 MVC 分为三个主要部分:Model(模型)、View(视图)和 Controller(控制器)。模型处理数据和业务逻辑,...

    extjs4-教程

    ExtJS4中可以为元素添加事件响应: - **添加单击事件响应**:通过Ext.onReady或Ext.application方法,在页面加载完毕后为DOM元素添加事件监听器,执行指定的函数。 #### 6. CSS和JavaScript引入注意事项 在ExtJS...

    extjs4动态添加表头

    extjs4动态添加表头字段、删除、增加记录!

    Extjs动态树的实现以及节点拖拽

    总的来说,ExtJS动态树的实现和节点拖拽涉及前端和后端的多个技术层面,包括JavaScript库的使用、事件监听、数据模型的处理、与服务器的通信以及数据库操作。掌握这些技能,开发者可以创建出功能强大且用户体验优秀...

    extjs4类似win下的窗口拖动效果

    在ExtJS4中,我们可以创建一个窗体(Window)组件,并通过配置或代码实现拖动功能。窗体(Window)是ExtJS中的浮动容器,它可以自由地在页面上移动。要实现拖动效果,我们需要设置`draggable`属性为`true`。以下是一...

    包含各种类型的extjs小图标,Extjs4小图标

    ExtJS 是一个流行的JavaScript框架,主要用于构建富客户端的Web应用程序。它提供了丰富的组件库、数据管理功能以及强大的用户界面(UI)元素。在标题和描述中提到的“Extjs4小图标”指的是ExtJS 4版本中使用的一系列...

    ExtJS4多文件上传,带进度条及管理

    本文将详细解析"ExtJS4多文件上传,带进度条及管理"这一主题,涵盖其核心概念、实现方式以及相关技术。 **一、ExtJS4概述** ExtJS4是Sencha公司推出的一个前端框架,它提供了丰富的组件库和强大的数据绑定机制,...

    Extjs 轻松实现下拉框联动

    最近小弟做了Extjs实现实现下拉框联动的效果,参考了好久才学会,闲下来发一个简单的例子。。呵呵

    Extjs4 grid使用例子

    ExtJS4是一个强大的JavaScript框架,主要用于构建富客户端的Web应用程序。在给定的"Extjs4 grid使用例子"中,我们可以深入理解如何在MVC架构下有效地利用ExtJS4的Grid组件。Grid组件是ExtJS中的核心部分,它提供了一...

    extjs dataview 显示图片 横向

    主要的四个文件 博文链接:https://zhao103804.iteye.com/blog/1884445

    extjs4中文文档

    EXTJS4是一个强大的JavaScript框架,主要用于构建富客户端Web应用程序。这个中文文档是EXTJS4的官方文档翻译版,为开发者提供了详细的API参考和教程,帮助理解EXTJS4的各种组件、功能和工作原理。 EXTJS4的核心特性...

    ExtJs 动态添加表单

    在"动态添加表单"这个主题中,我们将深入探讨如何在ExtJS中实现表单的动态创建和管理。 首先,我们要理解表单(Form)在ExtJS中的基本概念。表单是数据输入和验证的核心组件,可以包含各种字段类型,如文本框、下拉...

    ExtJs4.rar

    ExtJS是一个广泛应用于Web前端开发的JavaScript框架,其主要特点是提供了丰富的组件库和高度可定制的用户界面。在本文中,我们将深入探讨ExtJS4这一版本的重要特性、改进以及它如何扩展了先前版本的功能。 首先,...

Global site tag (gtag.js) - Google Analytics