You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决基于Ajax数据源的Select2无法设置初始值问题

问题描述

我有一个GET方法的API接口 sewatanah/getprovinsi,返回的JSON格式如下:

[{"id":"0","text":""},{"id":"11","text":"ACEH"},{"id":"12","text":"SUMATERA UTARA"}, ...]

当URL携带q参数时,接口会根据text属性的子串过滤结果。比如调用sewatanah/getprovinsi?q=ac会返回:

[{"id":"11","text":"ACEH"}, ...]

我用以下代码实现了Select2组件:

HTML代码

<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/select2@4.0.6-rc.0/dist/css/select2.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.0.6-rc.0/dist/js/select2.min.js"></script>

<div>
  <label>Provinsi</label>
  <select class="provinsi"></select>
</div>

CSS代码

.provinsi {
  width: 100%;
}

JavaScript代码

$('.provinsi').select2({
  allowClear: true,
  placeholder: '-',
  minimumInputLength: 3,
  ajax: {
    dataType: 'json',
    url: 'https://ip.jordkris.com/api/sewatanah/getprovinsi',
    data: function(params) {
      return {
        q: params.term
      };
    },
    processResults: function(data) {
      return {
        results: $.map(data, function(prop) {
          return {
            id: prop.id,
            text: prop.nama
          }
        })
      };
    },
    cache: true
  }
});

$('.provinsi').val('11').trigger('change');

问题:无法通过$('.provinsi').val('11').trigger('change');初始化选中值,因为数据仅通过Ajax请求获取,.val('11')不会触发Ajax请求,该如何解决?


解决方案

首先注意:原代码的processResults中错误使用了prop.nama,但API返回的字段是text,这会导致下拉选项显示为空,所有方案中都需要修正为prop.text。

方法1:手动添加

Select2需要对应的<option>元素存在才能识别选中状态,可在初始化Select2前手动添加目标选项:

// 先添加要选中的选项
$('.provinsi').append('<option value="11" selected>ACEH</option>');

// 初始化Select2(修正text字段映射)
$('.provinsi').select2({
  allowClear: true,
  placeholder: '-',
  minimumInputLength: 3,
  ajax: {
    dataType: 'json',
    url: 'https://ip.jordkris.com/api/sewatanah/getprovinsi',
    data: function(params) {
      return {
        q: params.term
      };
    },
    processResults: function(data) {
      return {
        results: $.map(data, function(prop) {
          return {
            id: prop.id,
            text: prop.text
          }
        })
      };
    },
    cache: true
  }
});

方法2:通过API获取目标项后手动设置

如果不想提前硬编码选项文本,可单独请求API获取目标项信息,再用Select2的data方法设置选中:

// 先初始化Select2(修正text字段映射)
$('.provinsi').select2({
  allowClear: true,
  placeholder: '-',
  minimumInputLength: 3,
  ajax: {
    dataType: 'json',
    url: 'https://ip.jordkris.com/api/sewatanah/getprovinsi',
    data: function(params) {
      return {
        q: params.term
      };
    },
    processResults: function(data) {
      return {
        results: $.map(data, function(prop) {
          return {
            id: prop.id,
            text: prop.text
          }
        })
      };
    },
    cache: true
  }
});

// 请求API获取ID为11的省份信息并设置选中
$.get('https://ip.jordkris.com/api/sewatanah/getprovinsi', function(data) {
  const targetItem = data.find(item => item.id === '11');
  if (targetItem) {
    $('.provinsi').select2('data', [{id: targetItem.id, text: targetItem.text}]);
  }
});

方法3:修改API支持ID查询(若有权限)

如果可以修改API,让其支持通过id参数直接返回指定项(如sewatanah/getprovinsi?id=11),可更高效地初始化:

// 请求指定ID的省份数据
$.get('https://ip.jordkris.com/api/sewatanah/getprovinsi?id=11', function(data) {
  if (data.length > 0) {
    // 添加选项并初始化Select2
    $('.provinsi').append(`<option value="${data[0].id}" selected>${data[0].text}</option>`);
    $('.provinsi').select2({
      // 保持原配置,修正text字段映射
      allowClear: true,
      placeholder: '-',
      minimumInputLength: 3,
      ajax: {
        dataType: 'json',
        url: 'https://ip.jordkris.com/api/sewatanah/getprovinsi',
        data: function(params) {
          return {
            q: params.term
          };
        },
        processResults: function(data) {
          return {
            results: $.map(data, function(prop) {
              return {
                id: prop.id,
                text: prop.text
              }
            })
          };
        },
        cache: true
      }
    });
  }
});

内容的提问来源于stack exchange,提问作者Jordy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 07:32:14