layui 高级查询 dynamicCondition 下拉框级联

通过layui表格 field json对象的形式传入

首先引入  dynamicCondition 

layui.extend({
    soulTable: 'layui-soul-table/soulTable',
    dynamicCondition: 'dynamicCondition/dynamicCondition',
}).use(['table', 'form', 'soulTable', 'func','dynamicCondition'], function () {
    var $ = layui.$;
    var form = layui.form;
    var table = layui.table;
    var soulTable = layui.soulTable;
    var func = layui.func;
    var dynamicCondition = layui.dynamicCondition;

创建dynamicCondition 对象 

var dcInstance = dynamicCondition.create({
        fields: dataFields //field json对象的形式传入
        , tableId:  Overdue.tableId
        , type: "simple"  //type:"simple"/"complex"
        , conditionTextId: "#condition"
        , popupBtnsWidth: 350
        , popupShowQueryBtn: false
        , unpopupShowQueryBtn: false
        , unpopupBtnswidth: 410
        , unpopupShowAddBtn: false
        , height: 400
        , queryCallBack: function (requestData) {
            requestDataStr = JSON.stringify(requestData);
            if (requestDataStr === "{}") {
                $("#condition").hide();
            } else {
                $("#condition").show();
            }
            full =1
        }
        , counts: 4
    });
    dcInstance.setDisplayModel('popup');//弹窗模式

 dynamicCondition创建的实例对象

成员类型说明实例
openfunction弹出动态添加查询条件界面open()
setDisplayModelfunction2.0.2版本新增。设置显示模式:弹窗/无弹窗。取值:popup/unpopup. 默认popupsertDisplayModel('popup)
setConditionfunction设置初始条件(适用于li的形式)setCondition([[‘name’,null,’’],[‘sex’,null,‘1’]])
getRowDivsfunction根据字段名称获取行div,返回一个dom类型的数组getRowDivs(conditionFieldVal)
getValfunction根据字段名称获对应的值,如果该字段条件有多个,则只取第一行对应的值。getVal(conditionFieldVal)

初始化高级搜索的条件

window.viewObj = {
    storageData: [],
    goodsCategoryData: [],
    goodsChildCategoryData: [],
    activeData: [],
    //创建一个创建option的方法
    renderSelectOptions: function (data, settings) {
        settings = settings || {};
        var valueField = settings.valueField || 'value',
            textField = settings.textField || 'text'
        var html = [];
        for (var i = 0, item; i < data.length; i++) {
            item = data[i];
            html.push('<option value="' + item[valueField] + '"');

            html.push('>');
            html.push(item[textField]);
            html.push('</option>');
        }
        return html.join('');
    }
}; 

 {title: '一级类目', field: 'goodsCategoryCode', edit: "select", templet: function () {
                var options = viewObj.renderSelectOptions(viewObj.goodsCategoryData, {
                    valueField: "code",
                    textField: "name"
                });
                return '<select lay-filter="goods"><option value="" >请选择一级类目</option>' + options + '</select>';
            }
        },
        {
            title: '二级类目', field: 'goodsChildCategoryCode', edit: "select",
            //不能使用一级类目的方式 虽然数据已经有了,但是下拉框没有重新渲染 重新打开是可以重新渲染上的
            templet: '<select><option value="">请选择二级类目</option>' + + '</select>'
        },

使用新增的辅助接口

afterOpen, instance.getRowDivs(fieldName),instance.getVal(fieldName)
afterOpen是在用户点击查询按钮弹出查询条件窗口后的回调函数。比如实现下拉框级联可以用到。
其实也可以不定义afterOpen,用下面的方法代替。
instance.getRowDivs(fieldName)和instance.getVal(fieldName) 


 $("#searchMore").click(function () {
        dcInstance.open();
    //直接在这里书写下拉框级联逻辑和定义afterOpen是一样的
form.on('select(goods)', function (data) {
            //拿到第一个field为 goodsChildCategoryCode <select>对象 goodsChild就是<select></select>对象
            var goodsChild =dcInstance.getRowDivs("goodsChildCategoryCode")[0].eleJq
//每一次监听之前把 select初始化            
goodsChild.html("<option value=''>请选择二级类目</option>")
            viewObj.goodsCategoryData.forEach(item=>{
                item.goodsChildCategory.forEach(i=>{
                    if(i.goodsCategoryCode == data.value){
                        var option1 ='<option value=' + i.code + '>'+ i.name +'</option>'
                        goodsChild.append(option1)
                    }
                })
            })
            form.render("select");
})

 总结:新版本也支持自定义扩展器,如果不是复杂的联动这种方式是简单的,像把联动的数据装到全局变量里是行不通的,因为dynamicCondition没有渲染下拉框的方法,layui有form.render("select")

        通过jquery最基础添加标签的形式,拿到这个标签的对象,然后再进行一些逻辑操作.

自定义扩展器高级查询组件dynamicCondition升级为v2.0.0版本(二)——扩展编辑器_xiaozaq的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下拉框级联可以通过AJAX实现。具体实现步骤如下: 1. 在HTML页面中定义下拉框 ``` <select id="firstSelect" onchange="getSecondSelect()"> <option value="">请选择</option> <option value="1">选项1</option> <option value="2">选项2</option> <option value="3">选项3</option> </select> <select id="secondSelect"> <option value="">请选择</option> </select> ``` 2. 编写AJAX代码 ``` function getSecondSelect(){ var firstSelectValue = document.getElementById('firstSelect').value; var url = "getSecondSelect.php?firstSelectValue=" + firstSelectValue; //创建XMLHttpRequest对象 var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } //发起AJAX请求 xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { document.getElementById('secondSelect').innerHTML = xmlhttp.responseText; } } xmlhttp.open("GET", url, true); xmlhttp.send(); } ``` 3. 编写后台PHP代码 ``` $firstSelectValue = $_GET['firstSelectValue']; $sql = "SELECT * FROM second_select WHERE first_select_value = $firstSelectValue"; $result = mysql_query($sql); while ($row = mysql_fetch_array($result)) { echo "<option value='" . $row['second_select_value'] . "'>" . $row['second_select_name'] . "</option>"; } ``` 以上代码完成了下拉框级联,当第一个下拉框的选项改变时,会发起AJAX请求,后台PHP代码会根据选项的值查询数据库,返回第二个下拉框的选项列表。前台JS代码会将返回的选项列表填充到第二个下拉框中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值