[easyui]封装一个datagrid

来源:互联网 发布:淘宝商品有质量问题 编辑:程序博客网 时间:2024/05/22 09:41

上一篇写的是封装了dialog,那么这一篇就来看看datagrid如何封装吧。

我希望最终是这样使用的

html

<table id="dg"></table>

js

// 定义(此时还未进行渲染)(一个选择器,一个参数配置)var datagrid = new hm.datagrid('#dg',{    rownumbers:true,    columns:[[]],    data:[]});// 初始化(渲染)datagrid.init();// 调用方法(此方法会先执行init(),所以除非必要是不需要手动调用init()方法的)datagrid.invoke('appendRow',{});

为什么我会想到要这样封装

项目里碰到这样的需求,有一张表格是用来录入的,录入完成后直接将表格所有数据一次性提交,这里就要求某个字段不能重复

首先明确这肯定是在添加数据之前进行判断,这里我都是调用appendRow进行行添加的,那就在我调用这句代码之前判断咯。

确实这是一种很普遍的做法吧,后来我又想,有没有对应的事件呢?在调用appendRow的时候会先触发该事件,如果返回false则不执行appendRow

然而并没有。

我突然觉得这个可以有!!

如果有这个事件,那我判断是否重复就写在该事件里,不符合条件的行就return false不让它添加。因为我这里appendRow只有一处倒是无所谓,万一还有别的地方也有appendRow呢,难道再判断一次?

完整代码 datagrid.js

说是完整代码,其实这里我只是提取出来最基本的代码,还可以自己扩展参数什么的

(function () {    'use strict';    // selector 选择器     // options  参数    function datagrid(selector, options) {        // 方便给datagrid.methods里面的方法获取到引用        var target = {            datagrid: null,            options: null        };        return {            init: function () {                if (null === target.datagrid) {                    target.options = $.extend({}, datagrid.defaults, datagrid.events, options);                    target.datagrid = $(selector).datagrid(target.options);                }                return this;            },            // 原本所有需要调用datagrid方法全部改为此方法            invoke: function (method, params) {                var result;                // 确保已经初始化了                this.init();                if (datagrid.methods[method]) {                    result = datagrid.methods[method].call(target, params);                } else {                    result = target.datagrid.datagrid(method, params);                }                // 这一句为了达到链式调用的效果                if (result === target.datagrid) { return this; }                return result;            }        }    }    datagrid.defaults = {        singleSelect: true,        rownumbers: true    };    datagrid.events = {        onBeforeAppendRow: function (row) { },        onAfterAppendRow: function (row) { }    };    datagrid.methods = {        // 重写appendRow方法,添加了两个事件。        appendRow: function (row) {            // 如果返回false,取消本次添加            if (false === this.options.onBeforeAppendRow.call(this.datagrid, row)) { return; }            this.datagrid.datagrid('appendRow', row);            this.options.onAfterAppendRow.call(this.datagrid, row);        }    };    window.hm.datagrid = datagrid;})();

总结

封装之后就会感觉一切都掌握在自己手里啊。

问题

可以看到我将参数、事件、方法都分开来写了,我当然是想能够很好的分离代码。

但我在想一个无聊的问题,比如我想要在单击行的时候显示行坐标,那自然是这样

datagrid.events = {    ...    onClickRow: function(index,row) {        console.log(index);    }    ...}

确实这样可以,但如果具体某一个表格也定义了onClickRow的话,这个就被覆盖掉了,我想要的是如何能保证绝对执行。

如果在datagrid函数内部添加的话,是可以做到的。

function datagrid(selector,options){    ...    return {        init: function() {            ...            if (null === target.datagrid) {                target.options = $.extend({}, datagrid.defaults, datagrid.events, options);                target.options.onClickRow = function(index, row) {                    // 这里是我想要的操作                    console.log(index);                    // 这里判断是否自定义了该事件                    if(options.onClickRow) {                        options.onClickRow.call(this,index,row);                    }                }                target.datagrid = $(selector).datagrid(target.options);            }            return this;        }    }}

但我想把这个事件分离出来,就写在 datagrid.events下面,这就是头疼的问题了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 3岁宝宝胆小怎么办 爱挑食的孩子怎么办 小孩上课经常发呆怎么办 小孩不爱吃饭挑食怎么办 一年级小孩学习不好怎么办 宝宝上课坐不住怎么办 八个月婴儿拉稀怎么办 八个月孕妇拉稀怎么办 孩子好动爱喊怎么办 八个月小孩发烧怎么办 孩子好动怎么办学龄前教育 小孩好动症该怎么办 小孩子好动症该怎么办 怀孕5个月胎死亡怎么办 小孩多动调皮怎么办 手心老是出汗是怎么办 孩子吃饭特别慢怎么办 小孩子老想睡觉怎么办 孩子下午上课犯困怎么办 小孩子有多动症该怎么办 初中写作业犯困怎么办 孩子晚上学习困怎么办 小孩子容易兴奋激动怎么办 中考时过度兴奋怎么办 小孩兴奋不睡觉怎么办 孩子突然反常不听话怎么办? 婴儿亢奋不睡觉怎么办 宝宝听力筛查没通过怎么办 7个多月宝宝缺钙怎么办 暑假孩子天天看电视怎么办 移植后天天便秘怎么办 天天拉屎还便秘怎么办 孩子不爱吃鸡蛋怎么办 孩子看书没耐心怎么办 5岁宝宝鼻炎怎么办 手术后认知障碍怎么办 孩子很调皮好动怎么办 学生打家长该怎么办 老师打学生家长该怎么办 三岁儿子多动症怎么办 小孩一直缺锌怎么办