zoukankan      html  css  js  c++  java
  • avalon.js 多级下拉框实现

    学习avalon.js的时候,有一个多级下拉框的例子,地址 戳这里 代码实现了联动,

    但是逻辑上面理解有点难度,获取选择的值 和 页面初始化 功能存在问题。

    在写地图编辑的时候,也用到了多级下拉框,特地整理下例子,其中主要实现的难点就是初始化数组的值。

    var data = [
        {"id": 0, "name": "1公司", "grade": -1, "parentid": "-1"},
        {"id": 1, "name": "广东公司", "grade": 0, "parentid": "0"},
        {"id": 2012300001, "name": "广州1分公司", "grade": 1, "parentid": 1},
        {"id": 200000000, "name": "广州分公司", "grade": 1, "parentid": 1},
        {"id": 4050, "name": "天河分公司", "grade": 2, "parentid": 200000000},
        {"id": 999182, "name": "工业园营销服务中心", "grade": 3, "parentid": 4050},
        {"id": 4174, "name": "南沙分公司", "grade": 2, "parentid": 200000000},
        {"id": 10121, "name": "南沙营销服务中心", "grade": 3, "parentid": 4174},
    ];
    var MAIN_KEY;
    var keyTree = {};
    var keyMap = {};
    for (var i = 0, len = data.length; i < len; i++) {
        var obj = data[i];
        var pId = obj.parentid;
        keyMap[obj.id] = obj;
        if (obj.parentid == -1) {
            MAIN_KEY = obj.id;
        } else {
            keyTree[pId] = keyTree[pId] || [];
            keyTree[pId].push(obj.id);
        }
    }
    
    var  noop =  function () {};
    window.vmMultiSelect = avalon.define({
        $id: "multiSelect",
        areaShap: [MAIN_KEY, ""], //数据形式,一开始为根结点id,不显示下拉框, 最后一个为可选择下拉框,则为'',当前选中值,则为最后不为''的值
        selectchange: function(val, m) { //数据形变化时
            var index = m.args[0].$index;
            if (vmMultiSelect.isInitSelect(index) === false) return;
            var areas = vmMultiSelect.areaShap;
            for (var i = areas.length - 1, end = index; i > end; i--) {
                areas.removeAt(i);//清楚子孙
            }
            if (keyTree[val]) {
                areas.push("");//有儿子,则push""
            }
        },
        isInitSelect: noop,
        initSelect: function (val) {
            vmMultiSelect.areaShap = val;
            var len = vmMultiSelect.areaShap.length - 1;
            vmMultiSelect.isInitSelect = function (index) {
                console.log(index, len)
                if (index < len) {    
                    return false;//不响应selectchange
                } else {
                    vmMultiSelect.isInitSelect = noop;//恢复响应selectchange
                    return false;
                }
            }
        }
    });
    //vmMultiSelect.initSelect([0, "1", "200000000", "4050", ""]); 通过直接设置数据,初始化select(也可以再写个函数,自己组织成对应数据形式)

    在线事例代码,戳这里

  • 相关阅读:
    C#之app.config、exe.config和vshost.exe.config作用区别
    C#中decimal ,double,float的区别
    C#中取整,向上取,向下取
    mybatis中的#和$的区别
    mybatis在xml文件中处理大于号小于号的方法
    ORACLE分页查询SQL语法——高效的分页
    移除powerdesigner中Recent Files中无效链接的文件
    Visual Studio提示“无法启动IIS Express Web服务器”的解决方法
    ORA-12638: 身份证明检索失败 的解决办法
    态度决定一切《跟任何人都聊得来》
  • 原文地址:https://www.cnblogs.com/legu/p/4665324.html
Copyright © 2011-2022 走看看