J'ai un simple select2 qui charge un menu déroulant.
Mais quel est le meilleur moyen de recharger le menu déroulant chaque fois que le menu de sélection s'ouvre avec les résultats d'un appel AJAX? L'appel ajax reviendrait
<option value=1>
<option value=2>
etc
J'ai jeté un œil aux exemples de AJAX figurant dans la documentation de Select2, mais cela semble un peu compliqué pour ce dont j'ai besoin. TIA
Suppose que vous avez html
<p>
Hidden field value set in the following format:
<br />
<em>'34:Donnie Darko,54:Heat,27:No Country for Old Men'
</em></p>
<input type='hidden' id="e6" style="width: 500px;" value="34:Donnie Darko,54:Heat,27:No Country for Old Men" />
<br /> <button id="save">Save</button>
<p>
After it's initialised, the hidden field value will change to:<br />
<em>'34,54,27'</em>
<br />
That is the value sent to the server
</p>
Et pour select2 Ajax
function MultiAjaxAutoComplete(element, url) {
$(element).select2({
placeholder: "Search for a movie",
minimumInputLength: 1,
multiple: true,
id: function(e) { return e.id+":"+e.title; },
ajax: {
url: url,
dataType: 'json',
data: function(term, page) {
return {
q: term,
page_limit: 10,
apikey: "z4vbb4bjmgsb7dy33kvux3ea" //my own apikey
};
},
results: function(data, page) {
alert(data);
return {
results: data.movies
};
}
},
formatResult: formatResult,
formatSelection: formatSelection,
initSelection: function(element, callback) {
var data = [];
$(element.val().split(",")).each(function(i) {
var item = this.split(':');
data.Push({
id: item[0],
title: item[1]
});
});
//$(element).val('');
callback(data);
}
});
};
function formatResult(movie) {
return '<div>' + movie.title + '</div>';
};
function formatSelection(data) {
return data.title;
};
MultiAjaxAutoComplete('#e6', 'http://api.rottentomatoes.com/api/public/v1.0/movies.json');
$('#save').click(function() {
alert($('#e6').val());
});
Essayez d’appeler multiajax avec ceci! Reportez-vous - http://jsfiddle.net/JpvDt/112/
Essaye ça:
$(document).ready(function () {
$('#Registration').select2({
placeholder: 'Select a registration',
allowClear: true,
ajax: {
quietMillis: 10,
cache: false,
dataType: 'json',
type: 'GET',
url: '@Url.Action("GetItems", "ItemsController")', //This asp.net mvc -> use your own URL
data: function (registration, page) {
return {
page: page,
pageSize: 100,
registration: registration,
otherValue: $("#OtherValue").val() // If you have other select2 dropdowns you can get this value
};
},
results: function (data, page) {
var more = (page * pageSize) < data.total; // whether or not there are more results available
return { results: data.dataItems, more: more }; // notice we return the value of more so Select2 knows if more results can be loaded
}
},
formatResult: FormatResult,
formatSelection: FormatSelection,
escapeMarkup: function (m) { return m; }
});
});
function FormatResult(item) {
var markup = "";
if (item.name !== undefined) {
markup += "<option value='" + item.id + "'>" + item.name + "</option>";
}
return markup;
}
function FormatSelection(item) {
return item.name;
}
Voir le Chargement de données distantes exemple sur la page Web Select2 .
Il chargera les options de la liste de sélection de manière dynamique en utilisant ajax à chaque ouverture.
$("#e6").select2({
placeholder: "Search for a movie",
minimumInputLength: 1,
ajax: { // instead of writing the function to execute the request we use Select2's convenient helper
url: "http://api.rottentomatoes.com/api/public/v1.0/movies.json",
dataType: 'jsonp',
data: function (term, page) {
return {
q: term, // search term
page_limit: 10,
apikey: "ju6z9mjyajq2djue3gbvv26t" // please do not use so this example keeps working
};
},
results: function (data, page) { // parse the results into the format expected by Select2.
// since we are using custom formatting functions we do not need to alter remote JSON data
return {results: data.movies};
}
}
});
Si vous essayez d'afficher la liste déroulante avec du JSON pré-chargé par défaut, le moment où vous cliquez sur le fichier que vous souhaitez afficher doit apparaître avec la liste des données renseignées, sans avoir à taper une seule lettre, Set minimumInputLength: 0 et fonctionne comme un charme.
Cela déclenche le JSON comme si votre tâche consistait à "charger le JSON avec le focus à l'aide de select2".
J'ai ajouté du code mais, ne pouvant pas utiliser AJAX pour récupérer JSON à distance dans un extrait, je ne pouvais pas utiliser l'extrait.
N'oubliez pas que c'est une solution que vous avez ajoutée à votre code, n'utilisez pas l'une des solutions répertoriées ci-dessous. Je l'utilise pour décrire le correctif.
$(".myContainer").select2({
ajax: {
url: 'myJSONpath',
dataType: 'json',
delay: 250,
data: function(params) {
return {
q: params.term, // search term
page: params.page
};
},
minimumInputLength: 0, // so here is a trick 0 will trigger ajax call right when you click on field
processResults: function(data, params) {
//process your results
},
.... et ainsi on continue avec vos autres propriétés ...