easyui-datagrid 编辑模式详解

   一,建立编辑器

从api得知,扩展一种新的编辑器类型,需要提供以上几个方法。项目中正好需要一个checkbox 类型编辑器,但在easyui中并没提供这样的编辑器,那我们可以通过扩展编辑器来解决,扩展如下

 1  $.extend($.fn.datagrid.defaults.editors, {
 2     checkbox: {//调用名称
 3         init: function (container, options) {
 4            //container 用于装载编辑器 options,提供编辑器初始参数
 5             var input = $(‘<input type="checkbox" class="datagrid-editable-input">‘).appendTo(container);
 6            //这里我把一个 checkbox类型的输入控件添加到容器container中
 7            // 需要渲染成easyu提供的控件,需要时用传入options,我这里如果需要一个combobox,就可以 这样调用 input.combobox(options);
 8             return input;
 9         },
10         getValue: function (target) {
11            //datagrid 结束编辑模式,通过该方法返回编辑最终值
12            //这里如果用户勾选中checkbox返回1否则返回0
13             return $(target).prop("checked") ? 1 : 0;
14         },
15         setValue: function (target, value) {
16            //datagrid 进入编辑器模式,通过该方法为编辑赋值
17             //我传入value 为0或者1,若用户传入1则勾选编辑器
18             if (value)
19                 $(target).prop("checked", "checked")
20         },
21         resize: function (target, width) {
22            //列宽改变后调整编辑器宽度
23             var input = $(target);
24             if ($.boxModel == true) {
25                 input.width(width - (input.outerWidth() - input.width()));
26             } else {
27                 input.width(width);
28             }
29         }
30     }
31 });

新的编辑扩展好以后,跟系统默认的编辑器使用方式一样:

二 , 获取编辑器

datagrid 通过调用 beginEdit 传入要开始编辑行的对应的索引,该行进入编辑模式。通过 endEdit 或者 cancleEdit结束编辑模式,endEdit会提交一个数据变更记录,cancleEdit会还原为初始数据。

getEditors以及getEditor 返回指定行当前编辑器,getEditor 底层调用getEditors 方法。getEditors 返回一个编辑器对象数组。

三,编辑器事件

一个项目中存在这样三个需求

1,根据不同的操作结果,渲染不同编辑控件的操作模式,如以下图所示,用户选择小组1,日期控制范围必须到天,右侧日期控件提供按天选择展示。用户选择小组6,日期控制范围到月就可以了,右侧日期控件提供按月选择展示。

2,列表中存在开始日期,和结束日期必须控制开始日期不能大于结束日期或者结束日期不能大于开始日期

3,根据用户选择的开始日期,提取对应的年份。

针对这两个需求,该怎么实现呢?

先来了解下datagrid在编辑模式提供哪些可用事件,以及如何扩展一个新数据验证规则

API中提供事件:

扩展数据验证规则:

 1 $.extend($.fn.validatebox.defaults.rules, {
 2    //验证开始日期只能小于结束日期
 3     sdatecompare: {
 4         validator: function (value, param) {
 5             var end = param[0];
 6             if (typeof end == ‘string‘) {
 7                 end = $(param[0]);//结束日期 selector
 8             }
 9             if (!end.datebox("getValue")) {
10                 return true;
11             }
12             var endDate = new Date(end.datebox("getValue"));
13             var CurDate = new Date(value);
14             return CurDate < endDate;
15         },
16         message: ‘开始日期必须小于结束日期‘
17     },
18     edatecompare: {
19         validator: function (value, param) {
20             var start = param[0];
21             if (typeof start == ‘string‘) {
22                 start = $(param[0]); //开始日期 selector
23             }
24             if (!start.datebox("getValue") || !value) {
25                 return true;
26             }
27             var startDate = new Date(start.datebox("getValue"));
28             var CurDate = new Date(value);
29             $.fn.validatebox.defaults.rules.edatecompare.message = ‘结束日期必须大于开始日期‘;
30             return CurDate > startDate;
31         },
32         message: ‘‘
33     },
34 });

有了以上两点基本知识,这三个需求处理起来就很顺利了。第一个需求,根据不同的数据渲染不同的界面。在此我看到了 onBeforeEdit 根据字面意思就是在开始编辑之前,官方解释,用户在开始编辑一行数据时触发。也就是说,在这个事件激发之前,datagrid根本还没有建立或初始编辑器控件,而我们又知道datagrid 编辑是通过列属性中editor中options渲染控件的,那在这里改变options的值不就好了么,于是在onBeforeEdit我敲上了一下js代码:

1 var zSelected = fazgl.grdtnz.datagrid("getSelected");
2 var ksOpts = $(this).datagrid("getColumnOption", "F_KSRQ");
3 var jsOpts = $(this).datagrid("getColumnOption", "F_JSRQ");
4 var rendmodes = ["year", ‘month‘];//easyui calendar 中扩展一个mode属性,用于显示选择到月或者到天
5 $.extend(ksOpts.editor.options, { mode: rendmodes[zSelected.F_SFFT] });
6 $.extend(jsOpts.editor.options, { mode: rendmodes[zSelected.F_SFFT] });

通过验证这个思路完全正确,合理处理了根据不同数据展现不同界面的需求。第一个需求到此结束,现在聚焦到第二个需求,开始日期必须小于结束日期,从上面扩展的数据验证规则sdatecompare和edatecompare,我们知道需要传入一个被比较日期控件的selector。那该怎么实现呢?在回看一下 API,其中有onBeginEdit 这么一个事件,通过查阅源码,了解到datagrid在激发该事件时已经对应的编辑控件已经创建完毕,那通过datagrid 提供方法 getEditors或者getEditor得到编辑器,其中的target不就是需要的selector么! 于是乎,我在onBeginEdit 中敲下了如下代码:

 1             var editors = $(this).datagrid("getEditors", index);
 2             var ed_Ksrq = editors[0];//开始日期编辑器
 3             var ed_Jsrq = editors[1];//结束日期编辑器
 4             //easyui 日期控件从 textbox扩展,所有需要得到对应textbox的options才能加入验证规则
 5             var ksopts = $(ed_Ksrq.target).datebox("textbox").validatebox("options");
 6             ksopts.validType = ksopts.validType || {};//如果编辑器最初设置,对应编辑器validType为null,这里做下为空判断
 7             $.extend(ksopts.validType, { sdatecompare: [ed_Jsrq.target] });
 8             var jsopts = $(ed_Jsrq.target).datebox("textbox").validatebox("options");
 9             jsopts.validType = jsopts.validType || {};
10             $.extend(jsopts.validType, { edatecompare: [ed_Ksrq.target] });

经过测试,思路完全正确,成功实现动态加入验证规则。有了以上经验,对于第三个需求,感觉已经没有什么难度了,datagrid提供 onEndEdit(销毁编辑器前) ,onAfterEdit(销毁编辑器后),都会返回 一个changes 对象,里边保存了变更的数据,于是我在onEndEdit 写下了如下代码:

 1  var nrow = {};
 2
 3             //判断是否有更改开始日期
 4
 5             if (changes["F_KSRQ"]) {
 6
 7                 var kAry = changes.F_KSRQ.split("-");
 8
 9                 var date = new Date(parseInt(kAry[0]), parseInt(kAry[1]) - 1);
10
11                 nrow["F_NIAN"] = date.getFullYear();
12
13                 nrow["F_KSY"] = kAry[1];
14
15                 nrow.F_KSRQ = row.F_KSRQ + "-" + "01";
16
17             }
18
19           //更新数据
20
21             $(this).datagrid("updateRow", {
22
23                 index: index,
24
25                 row: nrow
26
27             });
28
29             nrow = null;

这样就 onCancelEdit 这个事件没有讲解了,不过根据api也明白是在什么时候调用的,可以做哪些事,还等待合适的需求又来在讲解!

2015-11-24

时间: 2024-08-02 06:57:44

easyui-datagrid 编辑模式详解的相关文章

Extjs MVC开发模式详解

Extjs MVC开发模式详解 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs 4.x版本中引入了MVC开发模式,开始将一个JS(Extjs)应用程序分割成Model-View-Controller三层,为JS应用程序的如何组织代码指明了方向,同时使得大规模JS代码变得更加易于重用和维护:这就是Extjs MVC开发模式的初衷. 在官方给出的MVC例子中,我们可以看到一个简单的列表编辑功能,这篇文章就围绕这个功能进

Python open()函数打开文件的模式详解

Python open函数的模式详解 在Python中使用open()函数打开文件,并返回一个文件对象,然后通过文件对象对文件进行读写操作.不同类型的文件需要采用不同的模式来打开,并且采用不同模式打开文件,我们可以进行的操作以及程序运行的结果也是不同的. 打开模式 open()函数完整的语法格式为: open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)函数定义的参数

Javascript 严格模式详解

Javascript 严格模式详解 作者: 阮一峰 日期: 2013年1月14日 一.概述 除了正常运行模式,ECMAscript 5添加了第二种运行模式:"严格模式"(strict mode).顾名思义,这种模式使得Javascript在更严格的条件下运行. 设立"严格模式"的目的,主要有以下几个: - 消除Javascript语法的一些不合理.不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全: - 提高编译器效率,增加运行速度

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp

java 代理模式详解

java 动态代理(JDK和cglib) 设计模式这东东每次看到就明白可过段时间又不能很流利的说出来,今天就用详细的比喻和实例来加深自己的理解(小弟水平不高有不对的地方希望大家能指出来). (1)代理这个词生活中有很多比如在街边卖手机卡.充公交地铁卡的小商店他们都起了代理的作用,java中的代理跟这些小店商的作用是一样的.再比如我想在淘宝上开个服装店但又没有货源怎么办,这时候我就要跟淘宝上某一卖家联系做他的代理.我跟我的商家都要卖衣服(就好比我们都继承了卖衣服的接口sellClothesInte

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

Javascript设计模式之装饰者模式详解篇

一.前言: 装饰者模式(Decorator Pattern):在不改变原类和继承的情况下动态扩展对象功能,通过包装一个对象来实现一个新的具有原对象相同接口的新的对象. 装饰者模式的特点:1. 在不改变原对象的原本结构的情况下进行功能添加.2. 装饰对象和原对象具有相同的接口,可以使客户以与原对象相同的方式使用装饰对象.3. 装饰对象中包含原对象的引用,即装饰对象是真正的原对象经过包装后的对象. 二.Javascript装饰者模式详解: 描述:装饰者模式中,可以在运行时动态添加附加功能到对象中.当

保护模式详解

在ia32下,cpu有两种工作模式:实模式和保护模式. 在实模式下,16位的寄存器用"段+偏移"的方法计算有效地址. 段寄存器始终是16位的.在实模式下,段值xxxxh表示的以xxxx0h开始的一段内存.但在保护模式下,段寄存器的值变成了一个索引(还有附加信息)这个索引指向了一个数据结构的表(gdt/ldt)项,表项(描述符)中详细定义了段的其实地址.界限.属性等内容. 保护模式需要理解:描述符,选择子 描述符包括,存储段描述符(代码段,数据段,堆栈段),系统描述符(任务状态段TSS,

DES加密模式详解

DES加密模式详解 http://www.cnblogs.com/Lawson/archive/2012/05/20/2510781.html http://www.blogjava.net/wayne/archive/2011/05/23/350879.html 加密算法常见的有ECB模式和CBC模式: ECB模式:电子密本方式,这是JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里