Tengo varias selecciones que llene con JQuery Ajax. La mayoría carga bien Sin embargo, hay una o dos de estas consultas que, en unos pocos casos excepcionales, devuelven MUCHOS registros a la selección. Me preguntaba si la forma en que estoy completando los seleccionados es la forma más eficiente de hacerlo desde el código del lado del cliente.most * efficient * manera de poblar seleccionar con Jquery ajax
He omitido algunas cosas para hacer que el código sea un poco más corto.
$(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+/)]; });
}
Así que esto simplemente gira y llena las selecciones. ¿Hay una mejor manera de hacer esto? Tenga en cuenta que la línea de alerta ("éxito") se dispara casi de inmediato, por lo que los datos vuelven rápidamente, pero luego se bloquea al intentar completar la selección.
ACTUALIZACIÓN: (3) esto está funcionando realmente bien. Aunque hay algún problema. Tengo onBlur (función de llamada para volver a cargar selecciones) y cuando el onBlur está activado y las selecciones se vuelven a cargar, la página solo necesita FOREVER para cargar, por lo que tengo que detenerlo ... ¿no estoy seguro de por qué?
ServiceCall(service,
param,
function (data, args) {
var $select = $(selectId);
var vSelect = '';
if (prompt != null && prompt.length > 0) {
vSelect += '<option class=\'selectPrompt\' value=\'\' selected>{0}</option>'.format(prompt);
}
if (hasValue) {
$.each(data, function (i, v) {
vSelect += '<option value=\'{0}\'>{1}</option>'.format(v.Key, (propCase) ? v.Value.toProperCase() : v.Value);
});
}
else {
$.each(data, function (i, v) {
vSelect += '<option value=\'{0}\'>{1}</option>'.format(v, (propCase) ? v.toProperCase() : v);
});
}
$select.html(vSelect);
delete vSelect;
delete data;
},
FailedServiceCall);
}
@kralco, es una opción para que los datos devueltos con formato de 'val: Text' uno por línea? –
o 'val: text'' val: text' .. –
@kralco, en su ejemplo actualizado está agregando toda la información en cada 'option + =' no solo el elemento relevante del bucle .. –