动态添加项目到使用AJAX的jQuery Select2控件

时间:2014-08-21 14:01:17

标签: jquery ajax jquery-select2

我有一个使用AJAX填充的jQuery Select2控件:

<input type="text" name="select2" id="select2" style='width:400px' value="999">

var initialSelection = { id: '999', text:"Some initial option"};

$("#select2").select2({
    placeholder: "Select Option",
    minimumInputLength: 2,
    ajax: { 
        url: "/servletToGetMyData",
        dataType: 'json',
        data: function (term, page) { return { term: term }; },
        results: function (data, page) {  return { results: data.results} }
    },
    initSelection : function(element, callback){ callback(initialSelection); },     
    escapeMarkup: function (m) { return m; }
}); 

AJAX链接到可能选项的数据库,如您所见,需要两个输入字符。

问题是,如果数据库中不存在该选项,则用户可以使用对话框添加新选项。从该对话框返回后,我尝试:

var o = $("<option/>", {value: newID, text: newText});
$('#select2').append(o);
$('#select2 option[value="' + newID + '"]').prop('selected',true);
$('#select2').trigger('change');

但它不起作用。完全相同的代码适用于非AJAX Select2框。我尝试了各种替代方案,例如使用$('#select2').select2("val", newID);,但它不起作用。

我甚至尝试完全删除了Select2控件。但是,$('#select2').remove()仅删除原始&lt; input&gt;字段,但让Select2控件挥之不去。请注意,该页面有多个Select2控件,因此我不能使用Select2控件的类选择器,因为它将删除我需要的其他控件。

任何想法如何a)动态地向使用AJAX的Select2控件添加选项;或b)完全删除Select2控件,以便以编程方式添加回来?或任何其他解决方案......

修改 我发现另一个问题,显示如何使用.select2(“destroy”)删除select2元素。这是有效的,但在我看来,它是次优的。我更愿意只添加选项而不是销毁和重新创建select2。

9 个答案:

答案 0 :(得分:38)

从select2 v4开始,这样做要容易得多。您可以创建<td> <h3>Portfolio</h3> <h2><%= link_to @user.portfolio ,target: "_blank" %></h2> </td> ,并将其直接附加到new Option元素。请参阅我的codepen或以下示例:

&#13;
&#13;
select
&#13;
$(document).ready(function() {
    $("#state").select2({
      tags: true
    });
      
    $("#btn-add-state").on("click", function(){
      var newStateVal = $("#new-state").val();
      // Set the value, creating a new option if necessary
      if ($("#state").find("option[value=" + newStateVal + "]").length) {
        $("#state").val(newStateVal).trigger("change");
      } else { 
        // Create the DOM option that is pre-selected by default
        var newState = new Option(newStateVal, newStateVal, true, true);
        // Append it to the select
        $("#state").append(newState).trigger('change');
      } 
    });  
});
&#13;
&#13;
&#13;

提示:尝试在文本框中输入现有值,例如&#34; AL&#34;或&#34; WY&#34;。然后尝试添加一些新值。

答案 1 :(得分:28)

这提供了一个简单的解决方案: Set data in Select2 after insert with AJAX

$("#select2").select2('data', {id: newID, text: newText});      

答案 2 :(得分:16)

如果是Select2 Version 4 +

它改变了语法,你需要这样写:

// clear all option
$('#select_with_blank_data').html('').select2({data: [{id: '', text: ''}]});

// clear and add new option
$("#select_with_data").html('').select2({data: [
 {id: '', text: ''},
 {id: '1', text: 'Facebook'},
 {id: '2', text: 'Youtube'},
 {id: '3', text: 'Instagram'},
 {id: '4', text: 'Pinterest'}]});



//  append option
$("#select_with_data").append('<option value="5">Twitter</option>');
$("#select_with_data").val('5');
$("#select_with_data").trigger('change');

答案 3 :(得分:16)

在Select2 4.0.2中

$("#yourId").append("<option value='"+item+"' selected>"+item+"</option>");
$('#yourId').trigger('change'); 

答案 4 :(得分:10)

我已在此链接http://www.bootply.com/122726的帮助下解决了问题。希望能帮到你

在select2 jquery中添加选项,并使用已创建的链接ID(#addNew)绑定您的ajax调用,以获取后端的新选项。 和代码

 $.getScript('http://ivaynberg.github.io/select2/select2-3.4.5/select2.js',function(){

  $("#mySel").select2({
    width:'240px',
    allowClear:true,
    formatNoMatches: function(term) {
        /* customize the no matches output */
        return "<input class='form-control' id='newTerm' value='"+term+"'><a href='#' id='addNew' class='btn btn-default'>Create</a>"
    }
  })
  .parent().find('.select2-with-searchbox').on('click','#addNew',function(){
    /* add the new term */
    var newTerm = $('#newTerm').val();
    //alert('adding:'+newTerm);
    $('<option>'+newTerm+'</option>').appendTo('#mySel');
    $('#mySel').select2('val',newTerm); // select the new term
    $("#mySel").select2('close');       // close the dropdown
  })

});



<div class="container">
    <h3>Select2 - Add new term when no search matches</h3>
    <select id="mySel">
        <option>One</option>
        <option>Two</option>
        <option>Three</option>
        <option>Four</option>
        <option>Five</option>
        <option>Six</option>
        <option>Twenty Four</option>
    </select>
    <br>
    <br>
</div>

答案 5 :(得分:5)

延伸到Bumptious Q Bangwhistle的回答:

$('#select2').append($('<option>', { 
    value: item,
    text : item 
})).select2();

这会将新选项添加​​到<select>标记中,然后让select2重新呈现它。

答案 6 :(得分:3)

我是这样做的,它对我来说就像一个魅力。

var data = [{ id: 0, text: 'enhancement' }, { id: 1, text: 'bug' }, { id: 2, 

    text: 'duplicate' }, { id: 3, text: 'invalid' }, { id: 4, text: 'wontfix' }];

    $(".js-example-data-array").select2({
      data: data
    })

答案 7 :(得分:1)

$("#my_select").select2('destroy').empty().select2({data: [{id: 1, text: "new_item"}]});

答案 8 :(得分:0)

要使动态标记与ajax一起使用,这就是我所做的。

Select2版本3.5

这在3.5版本中很容易,因为它提供了createSearchChoice钩子。只要设置了multiple: truetags: true,它甚至可以用于多重选择。

HTML

<input type="hidden" name="locations" value="Whistler, BC" />

JS

$('input[name="locations"]').select2({
  tags: true,
  multiple: true,
  createSearchChoice: function(term, data) {
    if (!data.length)
      return { id: term, text: term };
    },
  ajax: {
    url: '/api/v1.1/locations',
    dataType: 'json'
  }
});

这里的想法是使用select2的createSearchChoice钩子,该钩子将用户输入的term和ajax响应(如data)传递给您。如果ajax返回一个空列表,则告诉select2提供用户输入的term作为选项。

演示:https://johnny.netlify.com/select2-examples/version3


Select2版本4.X

版本4.X不再具有createSearchChoice钩子,但这就是我做同样事情的方式。

HTML

  <select name="locations" multiple>
    <option value="Whistler, BC" selected>Whistler, BC</option>
  </select>

JS

$('select[name="locations"]').select2({
  ajax: {
    url: '/api/v1.1/locations',
    dataType: 'json',
    data: function(params) {
      this.data('term', params.term);
      return params;
    },
    processResults: function(data) {
      if (data.length)
        return {
          results: data
        };
      else
        return {
          results: [{ id: this.$element.data('term'), text: this.$element.data('term') }]
        };
    }
  }
});

想法是将用户键入到select2的data挂钩内的jQuery数据存储区中的术语存储起来。然后在select2的processResults挂钩中,我检查ajax响应是否为空。如果是这样,我会抓住用户输入的隐匿术语并将其作为select2的选项返回。

演示:https://johnny.netlify.com/select2-examples/version4