8

尝试使用 select2 插件创建两个链接的自动填充选择字段第一个选择包含国家名称(静态选择),第二个显示从第一个选择中选择的国家/地区的状态我的代码是

<select id="country" name="country" size="1" class=" form-control">
<option></option>
<option value="1">USA</option>
<option value="2">Untied Kingdom</option>
<option value="3">France</option>
etc........
</select>
<select id="states" name="states" size="1" class="form-control">
<option></option>
</select>

JavaScript 代码

$(document).ready(function() {
    $('#country').select2({
        placeholder: 'Select Country',
        allowClear: true
    });
    $('#state').select2({
        placeholder: 'Select State',
        allowClear: true
    });
    $('#country').change(function() {
            var selectedCountries = $('#countryoption:selected').val();
            var selectedCountries = 'id='+ selectedCountries;
            $.ajax({
                type: 'POST',
                url: 'http://localhost/CodeIgniter/countries/get_state/',
                dataType: 'html',
                data: selectedCountries,
                }).done( function( data ) {
                       data = $.map(data, function(item) {
                            return { id: item.id, text: item.name }; 
                        });
                        $('#state').select2({
                            data: data
                        });
                }
            })
    });
});

JSON 中的返回结果

{"id":"1","text":"Chigaco"}{"id":"4","text":"Albama"}{"id":"2","text":"Tulsa"} etc...........

我搜索了很多示例来帮助我解决这个问题,但是我需要的只是显示在第一个选择中选择的国家的状态并将其传递给第二个选择,知道我正在使用 select2 v4.0 和jQuery v2

4

2 回答 2

21

可以像链接标准一样链接 Select2 <select>。所以这意味着当第一个选择的值被链接时,第二个选择被重置(通常是一个占位符)并且选项通常也会改变。

对于如何使用 Select2 完成此操作,您有两种选择:

  1. 值变化时预加载第二个选项<select>,让 Select2 处理本地搜索。这与您当前尝试执行此操作的方式类似,但是当第二个中可以选择大量选项时可能会遇到问题<select>

    在您的情况下,一个国家/地区不应有数千个“州”(无论何种程度的州),因此本地搜索不应该成为太大的问题。

  2. 使用 Select2 的 AJAX 功能并根据 first 的值传入不同的参数作为url要使用的参数<select>。这要求您有一个动态端点,可以处理检索第二个选择的项目以及在搜索时过滤它们,因此它并不总是可行的。

    如果您已经有一个像这样支持过滤的端点,这是一个响应速度更快的选项,因为用户不必等待所有选项都被检索到,然后才能从第二个中选择一个选项<select>

您选择什么选项在很大程度上取决于您已经设置了什么、您正在使用的数据集的大小(Select2 不能很好地处理数千个选项)以及您想要提供的用户体验。

第一个选项的代码类似于

$("#first").select2({
  placeholder: 'Select a number range'
});

$("#second").select2({
  placeholder: 'Select a number'
});

$("#first").on("change", function () {
  $("#second option[value]").remove();
  
  var newOptions = []; // the result of your JSON request

  $("#second").append(newOptions).val("").trigger("change");
});

并且可以在以下 jsbin 进行测试,使用数字范围而不是国家和州:http://jsbin.com/wigalivapi/1/edit?html, output

请注意,虽然这与您使用的代码相似,但有一些小差异会引起您的注意。

  1. dataType: "html"当您真正期待时,您正在设置dataType: "json"。您在响应中返回 JSON,而不是 HTML。

  2. 在你第二次<select>打电话之前,你没有清理你的。.select2({data:[]})Select2 不会自动删除<option>它生成的标签data,因此您需要自己执行此操作。

  3. 当您更改 的值时<select>,您永远不会告诉 Select2 这件事。您需要在更改后的第二次重新触发该change事件。<select>

  4. 您在问题中提供的 JSON 似乎无效。现在我不确定这是否只是因为您将其作为示例,但我会使用JSONLint检查您的 JSON 响应,以确保它有效。

第二个选项的代码类似于

$("#first").select2({
  placeholder: 'Select a number range'
});

$("#second").select2({
  placeholder: 'Select a number',
  ajax: {
    url: http://localhost/CodeIgniter/countries/get_state/',
    type: 'POST',
    data: function (params) {
      return {
        id: $("#first").val(),
        search: params.term
      }
    }
  }
});

这可以在以下 jsbin 中进行测试,该 jsbin 使用一系列数字模拟响应(类似于其他示例):http://jsbin.com/gihusohepe/1/edit?html, output

于 2015-05-14T22:28:13.213 回答
-2

您在 json 响应中错过了逗号。

http://jsfiddle.net/jEADR/1570/

var data = [{"id":"1","text":"Chigaco"},{"id":"4","text":"Albama"},{"id":"2","text":"Tulsa"}];
var data2=[];
$.map(data, function(item) {
      data2.push( { id: item.id, text: item.text }); 
});
$('#state').select2({
       data: data2
 });
于 2015-05-14T21:42:37.663 回答