针对EasyUI的checkbox进行扩展

        我们知道,现目前最新版EasyUI新增了组件checkbox,但是官方提供的方法太少了,比如不能直接通过传入数据直接初始化checkbox(比如想datagrid那样,直接传入一个数组就可以初始化表格)、没有加载成功回调函数、不能通过js给复选框设置自定义属性等,针对这一情况,特别的对checkbox进行扩展封装,具体封装的代码如下所示(有相关的注释说明):

(function ($) {
    $.fn.extend({
        checkboxExt: function (options) {
            //默认参数
            var defaluts = {
                labelField: 'name',//绑定显示文本的字段Key(data对象中必须存在此Key)
                valueField: 'id',  //绑定值的字段Key(data对象中必须存在此Key)
                checkedValue: [],  //选中值的集合
                data: [],          /*初始化数据,
                                               说明:在数据中可以增加自定义属性,自定义属性的key为attrName,属性的value为attrVal(此情况是针对设置单个属性的)
                                                   针对设置多个属性的情况,直接增加属性attrs即可,格式如attrs:[{name:'attr1',val:'1'},{name:'attr2',val:'2'}]
                                       */
                labelPosition: 'after',
                onChangeExt: null, /*onChange扩展事件,返回选中对象和options
                                               其中选中对象格式如:{ curChked: 当前复选框是否被选中, curVal: 当前复选框的值, curObj: 当前复选框对象, vals: 所有勾选中复选框的值集合, objs: 所有复选框对象属性 }
                                                   其中的objs格式如:{name: 复选框显示的文本, checked: 复选框是否被选中, value: 复选框的值, obj: 复选框对象}
                                       */
                onLoadSuccess: null/*加载成功事件,返回选中对象和options
                                               其中的选中对象格式如{ vals: 所有勾选中复选框的值集合, objs: 所有复选框对象属性 }
                                                   其中的objs格式如:{name: 复选框显示的文本, checked: 复选框是否被选中, value: 复选框的值, obj: 复选框对象}
                                       */
            };

            var opts = $.extend({}, defaluts, options);

            this.each(function (index, ele) {
                if (opts.data && opts.data.length > 0) {
                    var allChkHtml = '';

                    //检查当前复选框是否为勾选中状态
                    var getIsChked = function (curVal) {
                        var isChked = false;

                        if (opts.checkedValue && opts.checkedValue.length > 0) {
                            for (var i = 0; i < opts.checkedValue.length; i++) {
                                if (opts.checkedValue[i] == curVal) {
                                    isChked = true;
                                    break;
                                }
                            }
                        }

                        return isChked;
                    };

                    for (var i = 0; i < opts.data.length; i++) {
                        //获取自定义属性
                        var chkCusAttr = opts.data[i].attrName != undefined && opts.data[i].attrName.length > 0 && opts.data[i].attrVal != undefined && opts.data[i].attrVal.length > 0 ? ' ' + opts.data[i].attrName + '="' + opts.data[i].attrVal + '" ' : '';
                        //获取多个自定义属性的情况
                        if (opts.data[i].attrs && opts.data[i].attrs.length > 0) {
                            for (var j = 0; j < opts.data[i].attrs.length; j++) {
                                if (opts.data[i].attrs[j].name != undefined && opts.data[i].attrs[j].name.length > 0 && opts.data[i].attrs[j].val != undefined && opts.data[i].attrs[j].val.length > 0) {
                                    chkCusAttr += ' ' + opts.data[i].attrs[j].name + '="' + opts.data[i].attrs[j].val + '" ';
                                }
                            }
                        }

                        //获取是否勾选中
                        var chkOptsChecked = getIsChked(opts.data[i][opts.valueField]) ? 'true' : 'false';
                        //设置onChange事件
                        var chkOptsChg = opts.onChangeExt && opts.onChangeExt.length > 0 ? ',onChange:' + opts.onChangeExt : '';
                        //设置data-options属性
                        var chkOpts = 'data-options="label:\'' + opts.data[i][opts.labelField]
                            + '\',labelPosition:\'' + opts.labelPosition
                            + '\',value:\'' + opts.data[i][opts.valueField]
                            + '\',checked:' + chkOptsChecked
                            + chkOptsChg + '"';

                        allChkHtml += '<input class="easyui-checkbox checkbox-ext" name="checkboxName" ' + chkOpts + '' + chkCusAttr + '>';
                    }

                    $(this).html(allChkHtml);
                    var chkObjs = $(this).find('.checkbox-ext');

                    //初始化checkbox
                    chkObjs.checkbox();

                    //获取勾选中的值集合和所有对象
                    var getChkObjs = function () {
                        var retValArr = [],
                            retObjArr = [];

                        chkObjs.each(function (index, thisChkObj) {
                            if ($(thisChkObj).next().find('.checkbox-checked').next().length > 0) {
                                retValArr.push($(thisChkObj).val());
                            }
                            retObjArr.push({
                                name: $(thisChkObj).checkbox('options').label,
                                checked: $(thisChkObj).next().find('.checkbox-checked').length > 0,
                                value: $(thisChkObj).val(),
                                obj: thisChkObj
                            });
                        });

                        return [retValArr, retObjArr];
                    };

                    chkObjs.checkbox({
                        onChange: function (thisIsChked) {
                            var curChkObjs = getChkObjs();
                            opts.onChangeExt({ curChked: thisIsChked, curVal: $(this).val(), curObj: this, vals: curChkObjs[0], objs: curChkObjs[1] }, opts);
                        }
                    });

                    if (opts.onLoadSuccess && typeof opts.onLoadSuccess == 'function') {
                        var curChkObjs = getChkObjs();
                        opts.onLoadSuccess({ vals: curChkObjs[0], objs: curChkObjs[1] }, opts);
                    }
                }
            });
        }
    });
})(jQuery);

调用示例:

        Html代码:<div id="panelMain"></div>
        JS代码:
            var chkData = {
                labelField: 'name',
                valueField: 'id',
                checkedValue: [1, 2],
                data: [
                    { id: 1, name: '成都', attrName: 'data-id', attrVal: '1', attrs: [{ name: 'data-attr1', val: '111' }, { name: 'data-attr2', val: '222' }] },
                    { id: 2, name: '德阳', attrName: 'data-name', attrVal: '2' },
                    { id: 3, name: '绵阳', attrs: [{ name: 'data-attr3', val: '333' }, { name: 'data-attr4', val: '444' }] }
                ],
                onChangeExt: function (obj, options) {
                    console.log(obj)
                },
                onLoadSuccess: function (obj, options) {
                    console.log(obj)
                }
            };
            $('#panelMain').checkboxExt(chkData);

运行效果:

发布了293 篇原创文章 · 获赞 31 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qubernet/article/details/103288968