Ich habe mehrere Auswahlen, die ich mit JQuery Ajax bevölkern. Die meisten laden gut. Es gibt jedoch eine oder zwei dieser Abfragen, die in wenigen seltenen Fällen eine Menge Datensätze an die Auswahl zurückgeben. Ich habe mich gefragt, ob die Art und Weise, wie ich die selects bevölkere, der effizienteste Weg ist, dies vom clientseitigen Code aus zu tun.Most * effiziente * Weg zu füllen mit Jquery Ajax
Ich habe etwas weggelassen, um den Code ein wenig kürzer zu machen.
$(function() {
FillAwcDll()
});
function FillAwcDll() {
FillSelect('poleDdl', 'WebService.asmx/Pole', params, false, null, false);
}
function ServiceCall(method, parameters, onSucess, onFailure) {
var parms = "{" + (($.isArray(parameters)) ? parameters.join(',') : parameters) + "}"; // to json
var timer = setTimeout(tooLong, 100000);
$.ajax({
type: "POST",
url: appRoot + "/services/" + method,
data: parms,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
clearTimeout(timer);
alert("success");
if (typeof onSucess == 'function' || typeof onSucess == 'object')
onSucess(msg.d);
},
error: function (msg, err) {
}
}
});
function FillSelect(sel, service, param, hasValue, prompt, propCase) {
var selectId = 'select#{0}'.format(sel);
if ($(selectId) == null) {
alert('Invalid FillSelect ID');
return;
}
$(selectId + ' option').remove();
$('<option class=\'loading\' value=\'\'>loading...</option>').appendTo(selectId);
ServiceCall(service,
param,
function (data, args) {
$(selectId + ' option').remove();
if (prompt != null && prompt.length > 0) {
$('<option class=\'selectPrompt\' value=\'\' selected>{0}</option>'.format(prompt)).appendTo(selectId);
}
$.each(data, (hasValue)
? function (i, v) {
$('<option value=\'{0}\'>{1}</option>'.format(v.Key, (propCase) ? v.Value.toProperCase() : v.Value)).appendTo(selectId);
}
: function (i, v) {
$('<option value=\'{0}\'>{1}</option>'.format(v, (propCase) ? v.toProperCase() : v)).appendTo(selectId);
})
},
FailedServiceCall);
}
String.prototype.format = function() {
var pattern = /\{\d+\}/g;
var args = arguments;
return this.replace(pattern, function (capture) { return args[capture.match(/\d+/)]; });
}
Also dies nur Schleifen und füllt die Auswahl. Gibt es einen besseren Weg, dies zu tun? Beachten Sie, dass die Alarmzeile ("Erfolg") fast sofort ausgelöst wird, so dass die Daten schnell zurückkommen, aber danach hängt es, um die Auswahl zu füllen.
UPDATE: (3) das funktioniert wirklich gut. Obwohl es ein Problem gibt. Ich habe onBlur (Call-Funktion, um neu zu laden wählt) und wenn die onBlur aktiviert ist und die wählt neu laden, die Seite dauert nur FOREVER zu laden, so lange ich muss es stoppen ... nicht sicher warum?
@kralco ist es eine Option, um die zurückgegebenen Daten als 'val formatiert haben: Text' eine pro Zeile? –
oder 'val: text'' val: text' .. –
@kralco, in Ihrem aktualisierten Beispiel fügen Sie die ganzen Daten in jeder 'Option + =' nicht nur das relevante Element aus der Schleife .. –