【问题标题】:select2 placeholder display group text and childrenselect2 占位符显示组文本和子项
【发布时间】:2019-07-22 05:02:31
【问题描述】:

我想知道是否可以将分组数据作为输入,在选择后在文本显示中添加分组文本值。

让我解释一下:

我的输入数据(ajax Api 请求):

    {
      "text": "France",
      "children" : [
        {
            "id": 1,
            "text": "Paris"
        },
        {
            "id": 2,
            "text": "Lyon"
        }
      ]
    },
    {
      "text": "Spain",
      "children" : [
        {
            "id": 3,
            "text": "Barcelona"
        }
      ]
    }

使用此配置:

<select class="js-available-states js-states form-control" style="width: 150px"><option></option></select>

    $('.js-available-projects').select2({
        placeholder: {
            id: '1',
            text: 'Select an option'
          },
        ajax: {
          url: '/city',
          type: "GET",
          dataType: 'json',
          processResults: function (data) {
            return {
                results: data
            };
          }
        },
      });

例如,如果我选择“Paris”,则在 select2 框中显示为选择的文本是“Paris”。 是否可以通过添加国家名称来自定义此文本?在我的示例中,它将是“法国 - 巴黎”。

谢谢

【问题讨论】:

    标签: jquery jquery-select2


    【解决方案1】:

    您正在搜索templateSelection 选项

    let data = [{"text":"France","children":[{"id":1,"text":"Paris"},{"id":2,"text":"Lyon"}]},{"text":"Spain","children":[{"id":3,"text":"Barcelona"}]}]
    
    $('.js-available-states').select2({
      data: data,
      placeholder: 'Select an option',
      templateSelection: function(data) {
        let label = $(data.element).parent('optgroup').attr('label');
        label = label ? label + ' - ' : '';
        return label + data.text;
      }
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2/js/select2.min.js"></script>
    
    <select class="js-available-states js-states form-control" style="width: 150px"></select>

    更新:用于远程数据

    $('.js-available-states').select2({
      ajax: {
        url: '/city',
        dataType: 'json',
        processResults: function(data) {
          data = data.map(i => {
            i.children = i.children.map(j => ({ ...j, group: i.text }))
            return i
          })
          return { results: data };
        }
      },
      placeholder: 'Select an option',
      templateSelection: function(data) {
        let label = data.group ? data.group + ' - ' : '';
        return label + data.text;
      }
    });
    

    【讨论】:

    • 感谢您的回答。奇怪的是,当我测试您的解决方案时,传递给 templateSelection 的数据对象没有“optgroup”。它似乎不同,因为它是一个 ajax 请求。因为如果我使用静态变量,它可以工作但不使用 ajax 请求。
    • API返回完全相同的结果(返回前在“processResults”中用console.log检查)
    • @Matt 已更新。如果可能,您还可以将group 属性(optiongroup 标签)添加到后端的子数组中
    猜你喜欢
    • 2013-10-27
    • 2016-10-04
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    相关资源
    最近更新 更多