如何将带optgroup分组的JSON数据正确加载到Select2下拉组件
代码存在的3个核心错误
- 遍历逻辑完全错误:后端返回的数组本身已经符合Select2分组数据格式,你在
processResults里多余的$.map+for...in遍历反而破坏了原有结构:遍历数组时拿到的key是数字索引不是分组名,遍历分组对象时会把text、children属性都当成子项处理,最终生成的结构完全不符合Select2要求。 - AJAX参数传递错误:Select2传入
data函数的是配置对象,不是搜索关键词本身,直接把整个对象传给后端会导致后端拿不到用户输入的搜索词。 - 缺少必要的空选项:开启
allowClear和placeholder时,必须给<select>标签预置一个值为空的<option>,否则占位符不显示、清除功能失效。
修正后的完整实现
HTML部分
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js" integrity="sha512-2ImtlRlf2VVmiGZsjm9bEyhjGW4dU7B6TNwh/hx/iSByxNENtj3WVE6o/9Lj4TJeVXPi4bnOIMXFIJJAeufa0A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" integrity="sha512-nMNlpuaDPrqlEls3IX/Q56H36qvBASwb3ipuo3MxeWbsQB1881ox0cRv7UPTgBlriqoynt35KjEwgGUeUXIPnw==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <select id="selectForm"> <!-- 必须添加空option,否则placeholder和allowClear功能异常 --> <option></option> </select>
JS部分
$("#selectForm").select2({ width: '30%', allowClear: true, placeholder: "Select Form", ajax: { url: '@Url.Action("GetOptionList")', delay: 250, dataType: "json", type: "POST", // 修正搜索参数传递逻辑 data: function (params) { return { term: params.term }; }, processResults: function (data) { // 后端返回结构已符合Select2分组要求,直接返回即可,无需额外转换 return { results: data }; } } });
补充说明
你给出的返回数据示例本身就是Select2官方支持的分组格式:顶层数组每一项对应一个选项组,text字段是组名,children数组是组下的选项列表,每个选项包含id和text字段即可被正确渲染,不需要额外做遍历映射。之前多余的转换逻辑是导致功能异常的核心原因。
内容的提问来源于stack exchange,提问作者chucta
相关产品推荐
相关产品推荐

