2012-09-11 27 views
7

Estoy usando la función de autocompletado de la interfaz de usuario jQuery. Puedo hacer que funcione con el ejemplo proporcionado con la interfaz de usuario jQuery de esta manera:jQuery UI autocompletar con JSON desde la URL

var availableTags = [ 
     "ActionScript", 
     "AppleScript", 
     "Asp", 
     "BASIC", 
     "C", 
     "C++", 
     "Clojure", 
     "COBOL", 
     "ColdFusion", 
     "Erlang", 
     "Fortran", 
     "Groovy", 
     "Haskell", 
     "Java", 
     "JavaScript", 
     "Lisp", 
     "Perl", 
     "PHP", 
     "Python", 
     "Ruby", 
     "Scala", 
     "Scheme" 
    ]; 

$("#tags").autocomplete({ 
    source: availableTags 
}); 

Esto funciona sin ningún problema. Pero necesito usar JSON como mi fuente de datos que pueden ser recuperados de esta manera: http://mysite.local/services/suggest.ashx?query=ball

Si voy a esa URL consigo JSON como esto:

[{"id":12,"phrase":"Ball"},{"id":16,"phrase":"Football"},{"id":17,"phrase":"Softball"}] 

¿Cómo puedo usar mi URL como la fuente de datos?

He intentado cambiar la opción de fuente de la siguiente manera:

$("#tags").autocomplete({ 
    source: "http://mysite.local/services/suggest.ashx" 
}); 

Pero no ayuda. Supongo que el servicio no sabe qué palabra clave se ha escrito en el campo de entrada, más o menos.

Cualquier puntero sería genial.

Respuesta

11

Necesita cambiar su fuente para cumplir con las siguientes especificaciones (descritas en el documentation para el widget). La fuente debe ser una matriz que contiene (o devolver una matriz que contiene):

  • cadenas simples, o:
  • objetos que contienen una propiedad label, una propiedad value, o ambas.

Si por algún motivo no puede cambiar el origen de su fuente remota, puede transformar los datos una vez que se hayan recuperado correctamente. He aquí cómo se haría eso:

$("#tags").autocomplete({ 
    source: function (request, response) { 
     $.ajax({ 
      url: "http://mysite.local/services/suggest.ashx", 
      data: { query: request.term }, 
      success: function (data) { 
       var transformed = $.map(data, function (el) { 
        return { 
         label: el.phrase, 
         id: el.id 
        }; 
       }); 
       response(transformed); 
      }, 
      error: function() { 
       response([]); 
      } 
     }); 
    }); 
}); 

Como se puede ver, usted necesita para tomar la llamada AJAX a sí mismo mediante introducción de una función a la opción source del widget.

La idea es usar $.map para transformar su matriz en una matriz que contiene elementos que el widget de autocompletar puede analizar.

Observe también que el parámetro data pasado a la llamada AJAX debe terminar como ?query=<term> cuando el usuario escribe un término.

+0

Gracias por la respuesta. Creo que puedo editar el JSON devuelto a la etiqueta y el valor en lugar de identificación y frase. Pero si cambio el JSON devuelto, ¿he utilizado la fuente correcta en mi ejemplo, o tengo que enviar el texto escrito al servicio de alguna manera? Me refiero a que el servicio toma un parámetro llamado "consulta", por lo que de alguna manera supongo que también tiene que enviar ese parámetro. ¿O estoy totalmente fuera de aquí? –

+0

Así que si cambias tu servicio web para devolver lo correcto pero tomas un argumento llamado 'query', tu código se verá similar al anterior, excepto que simplemente llamarás' response (data) 'en el manejador' success'. En otras palabras, dado que está cambiando la solicitud AJAX predeterminada que tiene lugar, igual tendrá que hacerlo usted mismo. –

+0

Genial, lo intentaré cuando regrese a mi computadora de desarrollo. Y al escribir datos: {query: request.term}, se llamará al servicio web con la entrada correcta como parámetro de consulta ¿verdad? –