Ich versuche, ein Dropdown-Programm mithilfe der fantastischen Select2 - Bibliothek programmgesteuert zu löschen. Die Dropdown-Liste wird dynamisch mit einem Remote-Ajax-Aufruf mit der Option Select2 query
gefüllt.
HTML:
<input id="remote" type="hidden" data-placeholder="Choose Something" />
Javascript:
var $remote = $('#remote');
$remote.select2({
allowClear: true,
minimumInputLength: 2,
query: function(options){
$.ajax({
dataType: 'json',
url: myURL + options.term,
error: function(jqXHR, textStatus, errorThrown){
smoke.alert(textStatus + ": server returned error on parsing arguments starting with " + options.term);
},
success: function(data, textStatus, jqXHR){
var results = [];
for(var i = 0; i < data.length; ++i){
results.Push({id: data[i].id, text: data[i].name});
}
options.callback({results: results, more: false});
}
});
}
});
Leider löst der Aufruf von $remove.select2('val', '')
die folgende Ausnahme aus:
Uncaught Error: cannot call val() if initSelection() is not defined
Ich habe versucht, attr
einzustellen, val
, text
und die Select2-spezifische data
-Funktion. Kann nicht scheinen, den Kerl klar zu machen und auf eine Art Button zu arbeiten. Hat jemand Vorschläge bekommen?
Das funktioniert für mich:
$remote.select2('data', {id: null, text: null})
Es funktioniert auch mit jQuery validate, wenn Sie es auf diese Weise löschen.
-- edit 2013-04-09
Zum Zeitpunkt des Schreibens dieser Antwort war dies der einzige Weg. Mit den neuesten Patches ist jetzt ein geeigneter und besserer Weg verfügbar.
$remote.select2('data', null)
Im Falle von Select2 Version 4+
es hat die Syntax geändert und Sie müssen so schreiben:
// 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'}]});
Dies ist der richtige Wert, select2 löscht den ausgewählten Wert und zeigt den Platzhalter zurück.
$remote.select2('data', null)
Mit select2 Version 4 können Sie diese kurze Notation verwenden:
$('#remote').html('').select2({data: {id:null, text: null}});
Dies übergibt ein json-Array mit Null-ID und Text an die select2 bei der Erstellung, leert jedoch zuerst mit .html('')
die zuvor gespeicherten Ergebnisse.
Für select2 Version 4 verwenden Sie dies einfach:
$('#remote').empty();
Nach dem Auffüllen des select-Elements mit einem Ajax-Aufruf benötigen Sie möglicherweise die folgende Codezeile im Erfolgsabschnitt, um den Inhalt zu aktualisieren:
success: function(data, textStatus, jqXHR){
$('#remote').change();
}
Sie sollten dieses verwenden:
$('#remote').val(null).trigger("change");
Vorgeschlagene Methode @Lelio Faieta arbeitet für mich, aber da ich bootstrap theme verwende, werden alle Bootstrap-Einstellungen für select2 entfernt. Also habe ich folgenden Code verwendet:
$("#remote option").remove();
Ich bin etwas spät dran, aber das funktioniert in der letzten Version (4.0.3):
$('#select_id').val('').trigger('change');
Diese beiden funktionieren für mich, um das Dropdown zu löschen:
.select2('data', null)
.select2('val', null)
Aber wichtiger Hinweis: value wird nicht zurückgesetzt. .Val () gibt die erste Option zurück, auch wenn sie nicht ausgewählt ist. Ich verwende Select2 3.5.3
Ab> 4.0 müssen Sie, um die select2 wirklich zu reinigen, Folgendes tun:
$remote.select2.val('');
$remote.select2.html('');
selectedValues = []; // if you have some variable where you store the values
$remote.select2.trigger("change");
Bitte beachten Sie, dass wir select2 anhand der ersten Frage auswählen. In Ihrem Fall wählen Sie das select2 höchstwahrscheinlich auf andere Weise aus.
Ich hoffe es hilft.
Ich habe die Antwort gefunden (Kompliment an user780178), die ich in dieser anderen Frage gesucht habe:
select2-Wert zurücksetzen und Platzhalter anzeigen
$("#customers_select").select2("val", "");
Sie können dies verwenden oder auf diese weiter verweisen https://select2.org/programmatic-control/add-select-clear-items
$('#mySelect2').val(null).trigger('change');
Dies hat mein Problem in Version 3.5.2 gelöst.
$remote.empty().append(new Option()).trigger('change');
Gemäß diesem Problem benötigen Sie eine leere Option im select-Tag, damit der Platzhalter angezeigt wird.
Da keiner von ihnen alle für mich gearbeitet hat (select2 4.0.3) ist der std select Weg gegangen.
for(var i = selectbox.options.length - 1 ; i >= 0 ; i--)
selectbox.remove(i);