如何在 select2 多选中预选值?

Posted

技术标签:

【中文标题】如何在 select2 多选中预选值?【英文标题】:How to pre-select values in select2 multi select? 【发布时间】:2014-12-31 01:11:00 【问题描述】:

我有这样的多重选择:

<select multiple="multiple" class="myList">
        <option value="1" selected="selected">Apple</option>
        <option value="2" selected="selected">Mango</option>
        <option value="3" selected="selected">Orange</option>
</select>

现在,除了必须在选择框中选择的那些选项外,我还想要额外的 ajax 功能,它可以从远程源提供值。

这是我的 select2 代码

$(function()
    $(".myList").each(function()

                $(this).select2(
                placeholder: "Search for fruits",
                minimumInputLength: 2,
                multiple: true,
                id: function(e)  
                return e.id+":"+e.name; ,
                ajax: 
                    url: "https://localhost:8443/fruit_search",
                    dataType: 'json',
                    data: function(term, page) 
                        return 
                            q: term
                        ;
                    ,
                    results: function(data, page) 
                    var frts=[];
                        $.each(data,function(idx,Frt)
                            frts[frts.length]=Frt;
                        );
                        return 
                            results: frts
                        ;
                    
                ,
                initSelection: function(element, callback) 
                    var data = [];
                ,
                formatResult: formatResult,
                formatSelection: formatSelection
                );
        );

);

但我得到了错误:

错误:当 Select2 附加到 &lt;select&gt; 元素。

但是当我使用&lt;input type="hidden"&gt; 时,我应该在哪里保留预先选择的选项?出现select2框时如何显示它们?

【问题讨论】:

【参考方案1】:

如果你只有值,那么你可以使用'val' 来获取这样的预选值。

var PRESELECTED_FRUITS = [ '1','2','3'];

$('.myList').select2().select2('val', PRESELECTED_FRUITS);  

【讨论】:

我正在尝试使用它,但它对我不起作用,jsfiddle.net/wzshpjb1 对我来说,只有一个值被预先填充,我正在使用 select2 v4.0.6 @VishalB 您需要触发更改事件。类似$('selector').select2(); $('selector').val(['1', '2', '3']).trigger('change');【参考方案2】:

您可以使用“数据”函数来设置初始值:

var PRESELECTED_FRUITS = [
     id: '1', text: 'Apple' ,
     id: '2', text: 'Mango' ,
     id: '3', text: 'Orange' 
];

$('.myList').select2('data', PRESELECTED_FRUITS)

注意:“val”函数是另一种设置初始值的方法,但您只需使用该函数指定 id。在这种情况下,您必须提供一个“initSelection”函数,该函数从 id 构建对象。

另请注意,“id”选项并不是唯一迫使您使用隐藏输入的选项。您也不能将“ajax”选项与选择元素一起使用。

至于“id”选项,我认为您不需要它。只需将逻辑放在 ajax“结果”函数中,这样它就可以构建具有正确 idtext 属性的对象数组,或者让服务器返回具有这些属性的对象。

jsfiddle demo

【讨论】:

只是一个问题,如果 'PRESELECTED_FRUITS' 为空会发生什么?它会产生错误吗?还是 select2 不再加载? 我发现它不会产生错误。它仍应定期加载。【参考方案3】:

要预设值,请使用 'val' 属性来预设所选值。

$(this).select2(
            val: ["1","2","3"]
    

但是为什么不去掉'id'函数呢?如果可能的话,您可以从服务器返回正确的“id”而不需要 id 函数。

【讨论】:

【参考方案4】:

您还可以将值加载到 html 中:

<select class="selector" multiple="multiple" >
    <option selected value="1">Apple</option>
    <option selected value="2">Mango</option>
    <option selected value="3">Orange</option>
</select>

并将 select2 连接到它:

$(".selector").select2(
    width: 'inherit',
    minimumInputLength: 2,
    minimumResultsForSearch: 10,
    placeholder: "Search for fruits",
    ajax: 
        delay: 1000,
        url: "/bla_foo",
        dataType: 'json',
        type: "GET",
    
)

select2 将预先填写表单。

【讨论】:

【参考方案5】:
$("#select2").select2('data', id: '3', text: 'myText');

【讨论】:

【参考方案6】:
$('select').select2(
    multiple: true,
    data: [
        id: 1, text: 'Foo', selected: true,
        id: 2, text: 'Bar', selected: true
    ]
)

【讨论】:

以上是关于如何在 select2 多选中预选值?的主要内容,如果未能解决你的问题,请参考以下文章

如何设置select2 ajax预选值?

Select2:如何在 VueJS 的多选中添加选项搜索字段

Select2:如何使列表不包含在下拉列表和多选中

Select2 ajax:在编辑模式下预选数据

如何从select2多选中的选项列表中删除选定的选项并按选择的顺序显示选定的选项

从 select2 多选中获取值并将它们写入模型属性