Ich habe select2 v4 mit einer statischen Auswahl (100 Optionen). Wenn die Benutzereingabe nicht in der Liste der Standardoptionen gefunden wird, muss ich eine Ajax-Suche durchführen.select2 Anzeige Standardoption (statisch) und tun Ajax Suche, wenn nicht gefunden
Da ich nicht in der Lage war, das select select-Objekt zu verwenden, verwende ich einen anderen für die Ajax-Suche. Also verstecke ich die Standardauswahl und ersetze sie mit dem Ajax_select. Mache die Ajax-Suche.
Code:
<script type="text/javascript">
var s2_search =''; //global var for search string
$("#default_select").select2({
placeholder: "Select an item",
debug: true,
minimumInputLength: 0, // important!!! => without setting to 0 the default data will not be shown
tags:true,
createTag: function (params) {
s2_search = params.term; //assing search string to var
},
templateResult: function(data){
var $result = $("<span></span>");
$result.text(data.text);
return $result;
},
escapeMarkup: function (markup) {
if(markup == 'No results found'){
// item is not found in default activate the ajax select
$('#div_default').addClass('hidden');
$('#div_new').removeClass('hidden');
new_select_func(s2_search)
}
else {
return markup;
}
}
});
var $myselect = $('#new_select').select2({
minimumInputLength: 0,
ajax: {
url: BASE_URL + '/get_more',
dataType: 'json',
cache: true,
delay: 350,
data: function (params) {
return {
q: params.term//, // search term
};
},
processResults: function (data, params) {
if(data === false){
// if the item is not found in the database display a modal form to insert the item
// This works
$.get(BASE_URL+'/get_new_form',{plate: params.term}, function (data) {
$('#myModal').find('.modal-body').html(data);
});
$('#myModal').modal('show');
}
else {
return {
results: data
};
}
}
},
templateSelection: formatNewSelection
});
function formatNewSelection(data, container) {
// append the new item to the default select
$("#default_select").append($('<option>', {value: data.id, text: data.text}));
//restore default select
$('#div_default').removeClass('hidden');
// hide new select
$('#div_new').addClass('hidden');
return data.text;
}
function new_select_func(search_val) {
//close default select
$("#default_select").select2("close");
//open new select
$myselect.select2('open');
// set search string and trigger ajax search
var $search = $myselect.data('select2').dropdown.$search || $myselect.data('select2').selection.$search;
$search.val(search_val);
$search.trigger('keyup');
}
</script>
Definitiv nicht der beste Weg, es zu tun, aber ich habe nur ein Problem. Wenn ich ein Element im ajax_select auswähle, um es an den Standard anzuhängen, wähle es die gleiche Option viermal aus. Kann mir jemand sagen, warum und gibt es einen besseren Weg, es zu tun?
Danke, Salain