Estoy tratando de encontrar una manera de usar el autocompletado de jQuery con la fuente de devolución de llamada obteniendo datos a través de una lista de objetos ajax json del servidor.
¿Alguien podría dar algunas direcciones?
Lo busqué en Google pero no pude encontrar una solución completa.
jquery
json
autocomplete
RollRoll
fuente
fuente
log
.success: function( data ) {response( data );} works inside the ajax call. I mean, what is that
respuesta () `? Crea algunos<li>
elementos de acuerdo con los datos, pero si quiero personalizar esos<li>
elementos, ¿qué debo hacer? Me gustaría agregar un par de atributos ...Si está devolviendo un objeto json complejo, debe modificar la función de éxito de su autocompletar de la siguiente manera.
$.ajax({ url: "/Employees/SearchEmployees", dataType: "json", data: { searchText: request.term }, success: function (data) { response($.map(data.employees, function (item) { return { label: item.name, value: item.id }; })); } });
fuente
Mi problema era que los usuarios finales comenzaban a escribir en un cuadro de texto y recibían sugerencias de autocompletar (ACP) y actualizaban el control de llamadas si se seleccionaba una sugerencia, ya que el ACP está diseñado de forma predeterminada. Sin embargo, también necesitaba actualizar muchos otros controles (cuadros de texto, DropDowns, etc.) con datos específicos de la selección del usuario final. He estado tratando de encontrar una solución elegante al problema y creo que vale la pena compartir la que desarrollé y, con suerte, le ahorrará al menos algo de tiempo.
WebMethod (SampleWM.aspx):
PROPÓSITO:
NOTAS:
//Call to custom function to return SP results as a DataTable // DataTable will consist of Field0 - Field5 Dim params As ArrayList = New ArrayList params.Add("@QueryFilter|" & QueryFilter) Dim dt As DataTable = Data.GetDataTableFromSP("AutoComplete", params, [ConnStr]) //Create a StringBuilder Obj to hold the JSON //IE: [{"Field0":"0","Field1":"Test","Field2":"Jason","Field3":"Smith","Field4":"32","Field5":"888-555-1212"},{"Field0":"1","Field1":"Test2","Field2":"Jane","Field3":"Doe","Field4":"25","Field5":"888-555-1414"}] Dim jStr As StringBuilder = New StringBuilder //Loop the DataTable and convert row into JSON String If dt.Rows.Count > 0 Then jStr.Append("[") Dim RowCnt As Integer = 1 For Each r As DataRow In dt.Rows jStr.Append("{") Dim ColCnt As Integer = 0 For Each c As DataColumn In dt.Columns If ColCnt = 0 Then jStr.Append("""" & c.ColumnName & """:""" & r(c.ColumnName) & """") Else jStr.Append(",""" & c.ColumnName & """:""" & r(c.ColumnName) & """") End If ColCnt += 1 Next If Not RowCnt = dt.Rows.Count Then jStr.Append("},") Else jStr.Append("}") End If RowCnt += 1 Next jStr.Append("]") End If //Return JSON to WebMethod Caller Return jStr.ToString
Autocompletar jQuery (AutoComplete.aspx):
$(function() { $("#LookUp").autocomplete({ source: function (request, response) { $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "SampleWM.aspx/GetAutoCompleteData", dataType: "json", data:'{QueryFilter: "' + request.term + '"}', success: function (data) { response($.map($.parseJSON(data.d), function (item) { var AC = new Object(); //autocomplete default values REQUIRED AC.label = item.Field0; AC.value = item.Field1; //extend values AC.FirstName = item.Field2; AC.LastName = item.Field3; AC.Age = item.Field4; AC.Phone = item.Field5; return AC })); } }); }, minLength: 3, select: function (event, ui) { $("#txtFirstName").val(ui.item.FirstName); $("#txtLastName").val(ui.item.LastName); $("#ddlAge").val(ui.item.Age); $("#txtPhone").val(ui.item.Phone); } }); });
fuente
$(document).on('keyup','#search_product',function(){ $( "#search_product" ).autocomplete({ source:function(request,response){ $.post("<?= base_url('ecommerce/autocomplete') ?>",{'name':$( "#search_product" ).val()}).done(function(data, status){ response(JSON.parse(data)); }); } }); });
Código PHP:
public function autocomplete(){ $name=$_POST['name']; $result=$this->db->select('product_name,sku_code')->like('product_name',$name)->get('product_list')->result_array(); $names=array(); foreach($result as $row){ $names[]=$row['product_name']; } echo json_encode($names); }
fuente
Usé la construcción de
$.each (data [i], function (key, value)
Pero debe hacer coincidir previamente los nombres de los campos de selección con los nombres de los elementos del formulario. Luego, en el ciclo después de "éxito", autocompleta elementos de la matriz "datos". Hizo esto: formulario autocompletado con éxito de ajaxfuente
Espero que esto ayude:
var token = document.getElementById('token').value; var nombre = document.getElementById('txtNombre').value; $("#txtNombre").keyup(function () { $.ajax({ type: "POST", url: host() + "Formulario/BuscarNombreAutocompletar/", data: JSON.stringify({ "nombre": nombre }), headers: { 'Authorization': 'Bearer ' + token }, contentType: "application/json; charset=utf-8", dataType: "json", success: function (data) { var dataArray = []; if (controlCarga(data)) { $.each(data[1], function (i, item) { dataArray.push(item.frmNombre) }); $('#txtNombre').autocomplete({ clearButton: true, source: dataArray, selectFirst: true, minLength: 2 }); } }, error: function (xhr, textStatus, errorThrown) { console.log('Error: ' + xhr.responseText); } }); });
fuente