【问题标题】:select2 4.0 - always add option to remote data resultsselect2 4.0 - 始终向远程数据结果添加选项
【发布时间】:2015-05-14 00:50:44
【问题描述】:

我再次升级 3.5 -> 4.0 并且“几乎”让这个用例像以前一样工作。我现在坚持的是如何始终将某个选项添加到 ajax 结果列表中。

这是我现在拥有的:

html:

<select id="vedit-filter" name="settings[filter]" class="form-control select2">
    <option value="default" selected="">default</option>
</select>

js:

$("#vedit-filter").select2({
    placeholder: "Select or enter application...",
    allowClear: true,
    multiple: false,
    tags: true,
    ajax: {
        dataType: 'json',
        delay: 1000,
        type: 'post',
        url: '/process/get_application_list.php',
        data: function (term, page) {
            return {
                term: term, // search term
                page_limit: 25, // page size
                page: page // page number
            };
        },
        results: function (data, page) {
            var more = (page * 25) < data.total; // whether or not there are more results available
            return {
                results: data.results,
                more: more
            };
        }
    }
});

这将加载“默认”作为初始选择的选项。如果用户改变了这个,那么它就消失了。如果需要,我想要一种方法让他们恢复到最初的选择。将它作为选项包含在我从 ajax 返回的结果中的唯一方法是什么?或者有没有办法在js端做到这一点?

更新:

默认选择始终是动态的,但在此示例中,我们使用的值/名称为“默认”。

<select id="vedit-filter" name="settings[filter]" class="form-control select2">
    <option value="default" selected="">default</option>
</select>

然后在js中:

var default_filter = $("#vedit-filter").val(); //get the default loaded from the html

placeholder: {
  id: default_filter, // or whatever the placeholder value is
  text: default_filter // the text to display as the placeholder
},

【问题讨论】:

    标签: jquery-select2-4


    【解决方案1】:

    我最近explained this on GitHub,但没有意识到这是一个巨大的变化。

    如果需要,我希望他们能够恢复到最初的选择。

    Select2 提供了placeholder 选项,如果尚未进行选择,它可以允许您为用户指定一个占位符,例如“选择一个项目”。为了支持&lt;select&gt;,默认情况下将选择第一个选项(由浏览器完成),Select2 要求存在“占位符”&lt;option&gt;。这也兼作 Select2 用来确定是否需要显示占位符的选项。

    除了placeholder 选项之外,Select2 还允许用户删除他们选择的选项,这会将选择恢复为占位符选项。这可以通过allowClear 选项启用。

    将它作为选项包含在我从 ajax 返回的结果中是唯一的方法吗?或者有没有办法在js端做到这一点?

    在您的示例中,您使用的是一个占位符选项,上面设置了value。因为 Select2 期望 value 默认为空白/空,所以您需要告诉 Select2 在检测占位符时要查找的内容。这可以通过将数据对象传递给 placeholder 来完成,Select2 在检查时将使用该对象。

    placeholder: {
      id: 'default', // or whatever the placeholder value is
      text: 'Select or enter application...' // the text to display as the placeholder
    }
    

    这将告诉 Select2 在 value 设置为 default(在您的示例中似乎是占位符/默认选项)时显示占位符。

    我现在坚持的是如何始终将某个选项添加到 ajax 结果列表中。

    虽然我认为我们可能已经解决了 the XY problem here,但我确实想指出,向 AJAX 结果列表添加新选项就像覆盖 processResults 一样简单。这是因为processResults 将数据对象列表直接传递给 Select2,这为您提供了将新选项注入列表的安全位置。

    您只需要将.push 额外的数据对象放入results,然后将它们传递回Select2。

    【讨论】:

    • 谢谢凯文...我在上面做了一个小更新。这正确地将“默认”(在本例中)显示为占位符,并在清除时恢复为该占位符。不过我发现了一个问题。当搜索没有返回结果时,我返回$ajax_result['results'][] = array('id' =&gt; 0,'text' =&gt; 'No results found...');,它告诉用户他们的搜索没有结果。单击它会恢复为我的“默认”占位符,但现在它不再具有与之关联的值。
    • @user756659 您是否能够实际控制是否返回“无结果”项?我建议只返回一个空数组并让 Select2 管理该通知,这样您就不必担心用户选择它。
    • 是的,这是我自己的脚本...我尝试返回一个空数组,但后来我遇到了“通知消失”的问题,因为我启用了标签以允许他们当前的搜索词选择。所以换句话说,每当他们搜索时,总会有一个选项,而不会显示“无结果”通知。
    • 另一个选项是不包含id,因此Select2不会将其注册为可以选择的选项。
    • 完美 - 可以工作并显示消息以及我需要做的所有其他事情。我假设id 需要text。谢谢!
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2023-01-22
    • 1970-01-01
    相关资源
    最近更新 更多