12

我正在使用最新版本的 Select2: Select2 4.0

我想允许用户输入自由文本。换句话说,如果用户在下拉列表中找不到选项(ajax 返回的数据),我希望他们能够“选择”他们输入的任何文本。

这是我的标记:

<select class="required form-control" id="businessName" data-placeholder="Choose An Name" > </select> 

这是我用来初始化 Select2 的 JavaScript:

$("#businessName").select2({
    ajax: {
      url: "/register/namelookup",
      dataType: 'json',
      delay: 250,
      type: 'post',
      data: function (params) {
        return {
          businessName: params.term, // search term
          page: params.page
        };
      },
      processResults: function (data, page) {
        return {
          results: data.items
        };
      },
      cache: false
    },
    escapeMarkup: function (markup) { return markup; },
    minimumInputLength: 4,
    createSearchChoice:function(term, data) {
        if ( $(data).filter( function() {
          return this.text.localeCompare(term)===0;
        }).length===0) {
          return {id:term, text:term};
        }
    },
});

我添加了createSearchChoice,但它不起作用。我也看过这个答案,但到目前为止还没有运气。

4

1 回答 1

29

这是 4.0.0 中的一个更改,它是由 3.x 中未记录的行为引起的。在 3.x 中,如果您正在使用,createSearchChoice您也应该一直在使用tags(将其设置为true空数组)。这是因为createSearchChoicetags被捆绑在一起。

在 4.x 中,createSearchChoice被重命名为,createTag因为它实际上是在创建标签。这记录在4.0.0-beta.2 发行说明中。此外,从未实现第二个(也未记录的)参数createSearchChoice- 但在这种情况下您实际上并不需要它。

因此,注意到这两个更改后,允许用户添加新选项的工作代码是

$("#businessName").select2({
    ajax: {
      url: "/register/namelookup",
      dataType: 'json',
      delay: 250,
      type: 'post',
      data: function (params) {
        return {
          businessName: params.term, // search term
          page: params.page
        };
      },
      processResults: function (data, page) {
        return {
          results: data.items
        };
      },
      cache: false
    },
    escapeMarkup: function (markup) { return markup; },
    minimumInputLength: 4,
    tags: true
});

请注意,我没有实现createTag,这是因为默认实现与您的旧实现相匹配createSearchChoice。我确实添加tags: true了,因为仍然需要它才能使其工作。

最重要的是,既然您已更改为<select>.

<select class="required form-control" id="businessName" data-placeholder="Choose An Name" ></select>

仅当您使用 an 时才需要该type属性(之前设置为),并且在 a 上无效。这不应该对您造成任何明显的变化。hidden<input /><select>

于 2015-05-03T22:08:48.643 回答