EasyUI 实现级联下拉框 可复用 静态或动态
博客专区 > Geeyu 的博客 > 博客详情
EasyUI 实现级联下拉框 可复用 静态或动态
Geeyu 发表于6个月前
EasyUI 实现级联下拉框 可复用 静态或动态
  • 发表于 6个月前
  • 阅读 28
  • 收藏 0
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 其实对于现在的前端框架来说,肯定有更简单美观的写法。这里仅仅是我的编程思路,以作记录与分享。 用表格和表单实现,CSS也就只会个px,见谅。

效果

  1. 通过一个按钮打开窗口,初始界面如下

初始界面

  1. 可以增删,第三级会根据第一级的选择,显示为输入或者下拉,两者都为combobox

界面


问题及解决

  1. 选择器获取不到JQuery对象
// EasyUI会改变其DOM结构(理所当然),所以应该优先使用EasyUI提供的API
$('#first_level').combobox('select', first);
  1. 新添加的行没有样式
// 重新渲染,使样式生效
$.parser.parse($('.dynamic-tr:last'));
  1. 关键方法
// 设置选中事件
element.combobox({
    onSelect: function (record) {
        // 初始化下拉框的内容
        element.combobox('loadData', data);
    }
})
  1. Json 数据结构的设计比较重要

实现

HTML

<div id="dialog_condition" style="width:700px;height: 400px">
	<div style="margin-left: -30px;margin-top: 30px">
		<form>
			<table class="table_list">
				<tr id="append_line" style="text-align: center">
					<td><input name="" hidden></td>
					<td>
						<a id="condition_add_btn" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a>
					</td>
					<td>
						<input id="first_level" name="1" prompt="first_level" class="easyui-combobox" style="width: 160px" data-options="editable:false"/>
					</td>
					<td>
						<input id="second_level" name="2" prompt="second_level" class="easyui-combobox" style="width: 160px" data-options="editable:false"/>
					</td>
					<td>
						<input id="third_level" name="3" prompt="third_level" class="easyui-textbox" style="width: 160px" data-options="panelHeight:0, hasDownArrow:false"/>
					</td>
					<td>
						<a id="condition_del_btn" class="easyui-linkbutton" plain="true">删除</a>
					</td>
				</tr>
			</table>
		</form>
	</div>
</div>

JavaScript


<script type="text/javascript">
    
    /**
     * 1. 不同菜单只需要更改 data 部分
     * 2. 表单元素的 name 需要自己更改
     * 3. 获取第三极下拉框值的时候要区分 输入 还是 选中
     * 4. 提示值需要自己修改
     */

    /************************************** start api **********************************/
    // 提交表单
    function submitConditions() {
        alert('submit...')
    }
    /************************************** end api **********************************/

    /************************************** start data **********************************/
    // 需要动态查询的三级下拉框,在此指定查询接口及combobox字段,查询接口应返回一个 json 数组
    var data_third = [{
        'DATA_INDEX': ['CUSTOMER', 'USERID']
    },{
        'CUSTOMER': {
            valueField: 'value',
            textField: 'text',
            url: ''
        },
        'USERID': {
            valueField: 'value',
            textField: 'text',
            url: 'getXxxList'
        }
    }];

    // 一级下拉框
    var data_first = [{
        value: 'TITLE',
        text: '主题'
    },{
        value: 'DESCRIBE',
        text: '描述'
    },{
        value: 'TITLEORDESCRIBE',
        text: '主题或描述'
    },{
        value: 'PRIORITY',
        text: '优先级'
    },{
        value: 'STATUS',
        text: '状态'
    },{
        value: 'SOURCE',
        text: '来源'
    },{
        value: 'CUSTOMER',
        text: '客户'
    },{
        value: 'USERID',
        text: '受理坐席'
    }];

    // 二级下拉框
    var comparator_default = [{
        value: 'YES',
        text: '是'
    },{
        value: 'NO',
        text: '不是'
    },{
        value: 'BH',
        text: '包含'
    },{
        value: 'NBH',
        text: '不包含'
    },{
        value: 'SW',
        text: '以某个值开头'
    },{
        value: 'EW',
        text: '以某个值结尾'
    }];
    var data_second = {
        'TITLE': comparator_default,
        'DESCRIBE': comparator_default,
        'TITLEORDESCRIBE': comparator_default,
        'PRIORITY': [{
            value: 'YES',
            text: '是'
        },{
            value: 'NO',
            text: '不是'
        }],
        'STATUS': comparator_default,
        'SOURCE': comparator_default,
        'CUSTOMER': comparator_default,
        'USERID': comparator_default
    };

    // 回显时的参数
    var data_load_Construction = {
        url: '',
        queryParam: [{
            key: 'abc',
            value: 'abcValue'
        }],
        idField: 'id',
        valueFieldFirst: 'field',
        textFieldFirst: '',
        valueFieldSecond: 'conditions',
        textFieldSecond: '',
        valueFieldThird: '',
        textFieldThird: 'value'
    };

    window.data_first = data_first;
    window.data_second = data_second;
    window.data_third = data_third;
    window.data_load_Construction = data_load_Construction;
    /************************************** end data **********************************/

    /************************************** start init **********************************/
    $(function () {
        initCondition();
    });
    function initCondition() {
        // 创建窗口
        $('#dialog_condition').dialog({
            title: '条件',
            width: 700,
            height: 400,
            closed: true,
            modal: true,
            buttons:[
                {text:'取消', iconCls:'icon-cancel', handler:function () {
                    cancelSubmitConditions();
                }},
                {text:'确定', iconCls:'icon-ok', handler:function () {
                    submitConditions();
                }}
            ]
        });
        // 打开、关闭窗口按钮
        $('#openDialog').on('click', function () {
            $('#dialog_condition').dialog('open')
        });
        function cancelSubmitConditions() {
            $('#dialog_condition').dialog('close');
        }
        // 解析样式
        $.parser.parse($('#dialog_condition'));

        // 增删按钮
        $('#condition_add_btn').on('click', function () {
            // 有个很难理解的bug,第二次给一级下拉绑定 onselect 方法会失败,因此用一下方法跳过 “第二次”
            addCondition();
            $('.dynamic-tr:last').remove();
            addCondition();
        });

        // 初始化菜单
        initSelect($('#first_level'), window.data_first);

        // 初始化下拉框选中事件
        initSelectAction(window.data_second, $('#first_level'), $('#second_level'), $('#third_level'));
    }
    /************************************** end init **********************************/

    /************************************** start main **********************************/
    function addCondition() {
        var new_tr = $("<tr class='dynamic-tr'>" +
            "<td style='margin-left: 50px'>" +
                "<input name='id' class='dynamic-id' hidden>" +
            "</td>" +
            '<td></td>' +
            "<td>" +
                "<input name='' prompt='first_level' class='easyui-combobox dynamic-td-first' style='width: 160px' data-options='editable:false'/>" +
            "</td>" +
            "<td>" +
                "<input name='' prompt='second_level' class='easyui-combobox dynamic-td-second' style='width: 160px' data-options='editable:false'/>" +
            "</td>" +
            "<td>" +
                "<input name='' prompt='third_level' class='easyui-textbox dynamic-td-third' style='width: 160px' data-options='panelHeight:0, hasDownArrow:false'/>" +
            "</td>" +
            "<td>" +
                "<a class='easyui-linkbutton condition_del_btn' plain='true'>删除</a>" +
            "</td>" + "</tr>");
        var append_line = $('.dynamic-tr:last');
        if (append_line.length === 0)
            $('#append_line').after(new_tr);
        else
            append_line.after(new_tr);
        // 重新渲染,使样式生效
        $.parser.parse($('.dynamic-tr:last'));
        // 添加删除事件
        $('.condition_del_btn').on('click', function () {
            $(this).parent().parent().remove();
        });
        // 初始化下拉框及选中事件
        initSelect($('.dynamic-td-first:last'), window.data_first);
        initSelectAction(window.data_second, $('.dynamic-td-first:last'), $('.dynamic-td-second:last'), $('.dynamic-td-third:last'));
    }

    function initSelect(element, data) {
        element.combobox('clear');
        element.combobox('loadData', data);
    }
    
    function initSelectAction(data, element, elementNext, elementLast) {
        element.combobox({
            onSelect: function (record) {
                elementNext.combobox('clear');
                elementNext.combobox('loadData', data[record.value]);
                var indexs = window.data_third[0].DATA_INDEX;//索引
                var contents = window.data_third[1];//数据
                if (indexs.indexOf(record.value) != -1)
                    setThirdSelectAsyn(elementLast, contents[record.value]);
                else
                    setThirdSelect(elementLast);
            }
        })
    }
    function setThirdSelectAsyn(element, data) {
        $.ajax({
            url: data['url'],
            success: function (result) {
                result = window.data_first;
                var data_third = [];
                result.forEach(function (e) {
                    var option = {};
                    option['value'] = e[data['valueField']];
                    option['text'] = e[data['textField']];
                    data_third.push(option);
                });
                element.combobox('clear');
                element.combobox('loadData', data_third);
                element.combobox({
                    panelHeight: 200,
                    hasDownArrow: true,
                    editable: false
                });
            }
        })
    }
    function setThirdSelect(element) {
        element.combobox({
            panelHeight: 0,
            hasDownArrow: false,
            editable: true
        });
        element.combobox('clear');
    }
    function getConditions(url, queryParams) {
        resetConditions();
        var query = {};
        if (queryParams) {
            query = queryParams;
        } else {
            var preQuery = window.data_load_Construction.queryParam;
            preQuery.forEach(function (e) {
                query[e.key] = e.value;
            })
        }
        $.ajax({
            url: url || window.data_load_Construction.url,
            data: query,
            success: function (data) {
                loadConditions(data);
            }
        })
    }
    function resetConditions() {
        $('#form_condition').form('reset');
        $('.dynamic-tr').remove();
    }
    function loadConditions(data) {
        data.forEach(function (e, i) {
            var id = e[window.data_load_Construction.idField];
            var first = e[window.data_load_Construction.valueFieldFirst] || e[window.data_load_Construction.textFieldFirst];
            var second = e[window.data_load_Construction.valueFieldSecond] || e[window.data_load_Construction.textFieldSecond];
            var third = e[window.data_load_Construction.valueFieldThird] || e[window.data_load_Construction.textFieldThird];
            if (i === 0) {
                $('#id').val(id);
                $('#first_level').combobox('select', first);
                $('#second_level').combobox('select', second);
                if (window.data_third[0].DATA_INDEX.indexOf(first) != -1)
                    $('#third_level').combobox('setValue', third);
                else
                    $('#third_level').combobox('setText', third);
            } else {
                $('#condition_add_btn').click();
                $('.dynamic-id:last').val(id);
                $('.dynamic-td-first:last').combobox('select', first);
                $('.dynamic-td-second:last').combobox('select', second);
                if (window.data_third[0].DATA_INDEX.indexOf(first) != -1)
                    $('.dynamic-td-third:last').combobox('setValue', third);
                else
                    $('.dynamic-td-third:last').combobox('setText', third);
            }
        })
    }
    /************************************** end main **********************************/
</script>
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 49
码字总数 27196
×
Geeyu
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: