学习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(也可以再写个函数,自己组织成对应数据形式)
在线事例代码,戳这里