跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)

        网页其中的拖放(drag-drop)是比較有趣的操作,extjs5中非常好的封装了拖放的动作,也有各种类来支持,可是要学好“拖放”这个东西真是非常难,特别是象我这样英语不好的人。看不太懂官网上的说明,做一个拖放的操作起码得几天的时间。
        以下完毕拖放删除的功能。即,选中一条记录或多条记录。然后拖动到“删除”button上。最后松开鼠标进行记录删除的操作。操作步骤:
        1、给Grid添加新的配置,使其记录同意拖动。

在Grid.js中的initComponent函数中添加

  1. this.viewConfig = {
  2. stripeRows : true, // 奇偶行不同底色
  3. enableTextSelection : false,
  4. // 增加同意拖动功能
  5. plugins : [{
  6. ptype : 'gridviewdragdrop',
  7. ddGroup : 'DD_grid_' + viewModel.get('tf_moduleName'), // 拖动分组必须设置,这个分组名称为:DD_grid_Global
  8. enableDrop : false // 设为false,不同意在本grid中拖动
  9. }]
  10.  
  11. };

来同意Grid能够进行单行或多行的拖动操作,ddGroup是一个分组,最好是设置成唯一的。enableDrop在这里设置为false , 假设设置成true,那么就能够拖动改变记录的位置,这个功能也是比較实用的,比如一个模块中有一个tf_orderId 顺序号的字段,拖动以后能够自己主动改变顺序号。那对记录的排序将是很方便的。这个功能以后会讲到。

        2、给“删除”button增加同意Drop的功能。
  1. {
  2. text : '删除',
  3. disabled : true,
  4. glyph : 0xf014,
  5. itemId : 'deletebutton',
  6. listeners : {
  7. click : 'deleteRecords', // 这里不要用handler,而要用click,由于以下要发送click事件
  8. // 删除按钮在渲染后增加能够Drop的功能
  9. render : function(button) {
  10. // 能够使Grid中选中的记录拖到到此按钮上来进行删除
  11. button.dropZone = new Ext.dd.DropZone(button.getEl(), {
  12. // 此处的ddGroup须要与Grid中设置的一致
  13. ddGroup : 'DD_grid_' + viewModel.get('tf_moduleName'),
  14.  
  15. // 这个函数没弄明确是啥意思,没有还不行
  16. getTargetFromEvent : function(e) {
  17. return e.getTarget('');
  18. },
  19. // 用户拖动选中的记录经过了此按钮
  20. onNodeOver : function(target, dd, e, data) {
  21. return Ext.dd.DropZone.prototype.dropAllowed;
  22. },
  23. // 用户放开了鼠标键,删除记录
  24. onNodeDrop : function(target, dd, e, data) {
  25. button.fireEvent('click', button); // 运行删除按钮的click事件
  26. }
  27. })
  28. }
  29. }
  30. }

尽管没有几条语句。要写出来还真是不easy。以下三个图演示了三个过程:拖动、放下、运行click事件。







        以上即是拖动删除的全部过程,假设要更好的了解拖放操作,请看官网的专题说明。


        以下再继续做拖放复制新增的功能,先选中一条记录。然后拖动到“新增”button上,会将选中的记录的值作为默认值(除了主键)来添加一条记录。

Grid中的拖动代码已经有了。仅仅要在“新增”button上加上drop的代码就可以。


  1. {
  2. text : '新增',
  3. xtype : 'splitbutton',
  4. itemId : 'new',
  5. glyph : 0xf016,
  6. menu : [{
  7. text : '复制新增',
  8. tooltip : '新增时先将当前记录添入到新记录中',
  9. itemId : 'newwithcopy',
  10. listeners : {
  11. click : 'addRecordWithCopy'
  12. },
  13. glyph : 0xf0c5
  14. }, '-', {
  15. text : '上传Excel表单条新增',
  16. tooltip : '依据指定的excel表添好数据后。上传新增一条记录',
  17. glyph : 0xf062
  18. }, {
  19. text : '上传Excel表批量新增',
  20. tooltip : '依据下载的Excel表中的要求加入数据后,上传批量新增数据',
  21. glyph : 0xf062
  22. }],
  23. listeners : {
  24. click : 'addRecord', // 这里不要用handler。而要用click,由于以下要发送click事件
  25. // 删除按钮在渲染后加入能够Drop的功能
  26. render : function(button) {
  27. // 能够使Grid中选中的记录拖到到此按钮上来进行复制新增
  28. button.dropZone = new Ext.dd.DropZone(button.getEl(), {
  29. // 此处的ddGroup须要与Grid中设置的一致
  30. ddGroup : 'DD_grid_' + viewModel.get('tf_moduleName'),
  31.  
  32. getTargetFromEvent : function(e) {
  33. return e.getTarget('');
  34. },
  35. // 用户拖动选中的记录经过了此按钮
  36. onNodeOver : function(target, dd, e, data) {
  37. return Ext.dd.DropZone.prototype.dropAllowed;
  38. },
  39. // 用户放开了鼠标键。删除记录
  40. onNodeDrop : function(target, dd, e, data) {
  41. var b = button.menu.down('#newwithcopy');
  42. b.fireEvent('click', b);
  43. }
  44. })
  45. }
  46. }
  47. }

复制新增的事件放在ModuleController.js中。

  1. // 依据选中的记录复制新增一条记录
  2. addRecordWithCopy : function() {
  3. var grid = this.getView().down('modulegrid'), sm = grid.getSelectionModel();
  4. if (sm.getSelection().length != 1) {
  5. Ext.toast({
  6. title : '警告',
  7. html : '请先选择一条记录,然后再运行此操作!
  8.  
  9. ',
  10. saveDelay : 10,
  11. align : 'tr',
  12. closable : true,
  13. minWidth : 200,
  14. useXAxis : true,
  15. slideInDuration : 500
  16. });
  17. return;
  18. }
  19. var model = Ext.create(grid.getStore().model);
  20. Ext.Array.each(model.fields, function(field) { // 将选中记录的model都赋给值新的记录
  21. model.set(field.name, sm.getSelection()[0].get(field.name));
  22. });
  23. model.set('tf_id', null); // 设置为null,可自己主动添加
  24. grid.getStore().insert(0, model);
  25. sm.select(model); // 选中当前新增的记录
  26. }

经过以上步骤,你能够运行新增菜单里的复制新增,也能够拖动一条记录到“新增”button上来新增一条记录。

这几节源代码修改得也比較多,假设跟着做有问题的话,下节会公布前20节的源代码,自行下载了研究吧。





跟我一起学extjs5(19--模块记录的拖放删除、拖放复制新增)的更多相关文章

  1. 跟我一起学extjs5(11--自己定义模块的设计)

    跟我一起学extjs5(11--自己定义模块的设计)        从这一节開始我们来设计并完毕一个自己定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息. 下面信息仅仅是我自己在开发过程中 ...

  2. 跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])

    跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])         写了几个月,总算有点盼头了,最终要从后台取得数据了.后台的spring mvc 和 service 仅仅能简单的 ...

  3. 跟我一起学extjs5(42--单个模块的数据新增方式)

    跟我一起学extjs5(42--单个模块的数据新增方式)         前面的章节中已经增加了一个自己定义的模块,而且能够进行数据的新增.改动.删除的操作了,在这个基础上就能够大作文章了. 这一节来 ...

  4. 跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)

    跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)         上面设计好了一个模块的主界面,以下通过菜单命令的运行来把这个模块增加到主界面其中. 在MainModule. ...

  5. 18、手把手教你Extjs5(十八)模块记录的拖放删除、拖放复制新增

    网页当中的拖放(drag-drop)是比较有趣的操作,extjs5中很好的封装了拖放的动作,也有各种类来支持,但是要学好“拖放”这个东西真是很难,特别是象我这样英语不好的人,看不太懂官网上的说明,做一 ...

  6. 跟我一起学extjs5(22--模块Form的自己定义的设计)

    跟我一起学extjs5(22--模块Form的自己定义的设计)         前面几节完毕了模块Grid的自己定义,模块Form自己定义的过程和Grid的过程类似,可是要更复杂一些.先来设计一下要完 ...

  7. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  8. 跟我一起学extjs5(24--模块Form的自己定义的设计[2])

    跟我一起学extjs5(24--模块Form的自己定义的设计[2])         在本节中将要增加各种类型的字段,在增加字段的时候因为能够一行增加多个字段,因此层次结构又多了一层fieldcont ...

  9. 跟我一起学extjs5(16--各种Grid列的自己定义渲染)

    跟我一起学extjs5(16--各种Grid列的自己定义渲染)         Grid各列已经可以展示出来了.列的类型包含字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自己定义了各种类型 ...

随机推荐

  1. [问题解决] ubuntu server12.04 按ctrl+alt+F1没用

    错误: ubuntu server12.04 想从图形化界面变成命令行界面时候,按ctrl+alt+F1没用 发生场景: 虚拟机下的ubuntu server12.04 解决方案: 因为ctrl+al ...

  2. Eclipse Rcp

    http://blog.csdn.net/soszou/article/details/7996748

  3. 面向对象程序设计-C++_课时16子类父类关系

    初始化列表 类名::类名(形参1,形参2,...形参n):数据成员1(形参1),数据成员2(形参2),...,数据成员n(形参n) { ... } 规则1,初始化列表进行数据成员的初始化 规则2,初始 ...

  4. Android建立模拟器进行调试

    安装好android开发环境后.用到下面几个命令.android, adb, emulator android - 最主要的android命令.能够进行sdk更新,列出设备源,生成虚拟设备等. adb ...

  5. 单例模式 GetInstance()

    如何设计一个含GetInstance()函数的类 直接上代码: 头文件(MyClass.h): class CMyClass { public: CMyClass(void); ~CMyClass(v ...

  6. js快排与namespace

    function quickSort(arr){ if(arr.length<=1){ return arr; } var num = Math.floor(arr.length/2); var ...

  7. JavaScript之Ajax

    简介:AJax是在2005年被Adaptive Path的Jesse James Garrett发明的,用户概括异步加载页面内容的技术---说通俗点,Ajax就是实现局部页面通过JavaScript与 ...

  8. 关于bootstrap弹出二级对话框的使用

    弹出二级对话框,即在对话框的基础上再弹出一个对话框.这对于CRM管理类系统来说应用场景很常见.看到网上有关于实现二级弹出框的方法,需要在一级对话框页面上添加不少css样式.其实,完全可以不用这么麻烦. ...

  9. .cs文件与aspx.cs文件之间的区别是什么???他们的作用是什么???ASPX文件的作用是什么?

    一般在vs里面新建一个页面会产生两种文件:一种是后缀名为.cs的,一种是.aspx. 简单的说,.cs文件一般是在里面实现功能的,而.aspx就是实现界面效果的. 区别:.cs文件里面写的是.net的 ...

  10. google base之LockImpl

    为了兼容不同的平台,这个类采用了impl模式,win平台通过CRITICAL_SECTION, 这样的话还是相对比较简单,具体就不详解了,不过不得不说boost的实现方式就要复杂到哪里去了,当然,好处 ...