easyui combobox实现下拉框获取后端数据并多选和取值,实现textbox的隐藏框

前文

  需求是在进入表单时,展示下拉框数据,数据从后端获取,并支持多选,最后再提交表单把数据传回给后端。虽然combobox可以支持用url请求后端,但因为form包含多个下拉框,不可能每个都自己去请求,所以直接通过ajax统一获取,至于多选则通过增加multi属性即可,最后通过getvalues获取键值提交即可。接下来会细说。

ajax实现combobox获取后端数据

  前端代码如下:

<form>
     <div style="padding:5px;margin-left:10px;margin-top:10px">
         <input class="easyui-textbox" id="task_id" style="width:330px;" prompt="任务号" readonly="readonly" disabled="disabled">   //定义任务id是不可见的
     </div>
     <div style="padding:5px;margin-left:82px;margin-top:20px;">
         <label>下拉框1:</label><input id="id1" style="width: 250px" class="easyui-combobox">
     </div>
     <div style="padding:5px;margin-left:82px;margin-top:20px;">
         <label>下拉框2:</label><input id="id2" style="width: 250px" class="easyui-combobox">
     </div>
     <div style="padding:5px;margin-top:20px;">
         <input class="easyui-textbox" id="task_info" style="width:390px" data-options="required:true" label="任务信息:" labelWidth="140px" labelAlign="right">
     </div>
</form>
<div data-options="region:'south'" style="height:50px;">
       <div style="padding: 20px; text-align:right;">
            <a href="javascript:void(0)" class="easyui-linkbutton" "submit_form()" style="width:80px">提交</a>
            <a href="javascript:void(0)" class="easyui-linkbutton" "close_form()" style="width:80px">关闭</a>
        </div>
</div>

  在form表单定义了两个下拉框,一个隐藏框,隐藏框在easyui的实现我也是取巧的,因为我发现正常用hidden、disabled是不够的,还需要配合js才能完成($("#task_id").next().hide()?,详细看下代码(仅展示ajax部分):
  关于combobox的valueField和textField需要解释下,这就相当于有label和value,也就是form表单的name和value,前者指代参数,后者指代显示的值,所以我们在获取值的时候,就有getValue和getValues获取valueField里的值,getText就可以相应获取框框里显示的值。

$.ajax({
          url: '/url/',
          type: 'get',
          dataType: 'json',
          success: function (data) {
              var task_id = data.task_id;
              $("#task_id").textbox('setValue', task_id);
              $("#task_id").next().hide();
              $("#id1").combobox({
                  valueField: 'label',
                  textField: 'value',
                  multiple:true,
                  required: true,
                  data: data.db_list
              });
              $("#id2").combobox({
                  valueField: 'label',
                  textField: 'value',
                  multiple:true,
                  required: true,
                  data: data.db_list
              })
          }
      })

  那后端我是用Django写的,这边也简单展示下后端代码,显示返回的格式:

def userpriv_apply(request):
    """
    生成权限申请表单数据
    :param request:
    :return:
    """
    task_id = get_task_id()
    db_list_data = []
    try:
    	#获取数据集合
        db_list =  MySQLDBInfo.objects.filter(country=country,env=env).values("dbname","index")
    except Exception as e:
        logger.error(e)
        print(e)
    for db in db_list:
        tmp = {"label":db["index"], "value":db["dbname"]}
        print(tmp)
        db_list_data.append(tmp)
    data = {}
    data["task_id"] = task_id
    data["db_list"] = db_list_data
    return HttpResponse(json.dumps(data, ensure_ascii=False), content_type="application/json")

  ok,这样就可以得到在表单初始化的时候,通过ajax向后台得到combobox的数据。那填写表单后,提交时要如何获得combobox的数据?因为是多选,所以要用getValues,但getValues得到的是数组,所以需要转为json格式(JSON.stringify),再用ajax传到后端,这样后端能正常取到值,详细如下:

function submit_orm() {
            var taskid = $("#task_id").textbox('getValue');
            var db_list = $("#d1").combobox('getValues');
            var db_list2 = $("#d2").combobox('getValues');
            var task_info = $("#task_info").textbox('getValue');
            var data = {
                "taskid":taskid,
                "db_list":JSON.stringify(db_list),
                "db_list2":JSON.stringify(db_list2),
                "task_info":task_info
            };
            $.ajax({
                url:'/userpriv_submit/',
                type:'POST',
                dataType:'json',
                data:data,
                success: function (data) {
                    show_alert(data.msg)
                },
                fail:function (data) {
                    show_alert("网络原因,请重新提交!")
                }
            })
        }

总结

  分享到此结束,因为把一些变量名改了,所以可能会出现对不上号的情况,不过整体思路就是这样,比较简单~

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
easyui combobox下拉框默认是单选的,如果要实现多选,需要做以下修改: 1. 在combobox的options中添加multiple:true,表示启用多选模式。 2. 在combobox的options中添加onSelect和onUnselect两个事件,用于在选择和取消选择时更新选中的值。 3. 在combobox的panel中添加checkbox或者复选,用于选择多个选项。 以下是实现多选的示例代码: HTML代码: ``` <input id="cc" class="easyui-combobox" style="width:200px;"> ``` JavaScript代码: ``` $('#cc').combobox({ url: 'get_data.php', valueField: 'id', textField: 'text', multiple: true, panelHeight: 'auto', onSelect: function(record){ var value = $(this).combobox('getValues'); value.push(record.id); $(this).combobox('setValues', value); }, onUnselect: function(record){ var value = $(this).combobox('getValues'); var index = value.indexOf(record.id); if (index >= 0){ value.splice(index, 1); } $(this).combobox('setValues', value); }, onLoadSuccess: function(){ var data = $(this).combobox('getData'); var value = $(this).combobox('getValues'); var panel = $(this).combobox('panel'); panel.find('.combo-panel-checkbox').remove(); $.each(data, function(index, item){ var checkbox = $('<input type="checkbox" class="combo-panel-checkbox">').val(item.id); if (value.indexOf(item.id) >= 0){ checkbox.prop('checked', true); } checkbox.insertBefore(panel.find('.combo-panel-list')); }); }, onShowPanel: function(){ var data = $(this).combobox('getData'); var value = $(this).combobox('getValues'); var panel = $(this).combobox('panel'); panel.find('.combo-panel-checkbox').prop('checked', false); $.each(data, function(index, item){ if (value.indexOf(item.id) >= 0){ panel.find('.combo-panel-checkbox[value="'+item.id+'"]').prop('checked', true); } }); } }); ``` 注:示例代码中的get_data.php是一个返回JSON格式数据的接口,可以根据实际情况修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值