Autocompletar jQueryUI: cuando no se devuelven resultados

Me pregunto cómo se puede capturar y agregar un controlador personalizado cuando el servidor devuelve resultados vacíos al usarjQueryUI autocompletar.

Parece que hay algunas preguntas sobre este punto relacionadas con los diversos complementos de jQuery (p. Ej.jQuery muestra automáticamente el mensaje de error "Sin datos" cuando los resultados están vacíos), pero me pregunto si hay una manera mejor / más simple de lograr lo mismo con el autocompletado jQueryUI.

Me parece que este es un caso de uso común, y pensé que quizás jQueryUI había mejorado el autocompletado de jQuery al agregar la capacidad de manejar limpiamente esta situación. Sin embargo, no he podido encontrar documentación de dicha funcionalidad, y antes de cortarla me gustaría tirar algunos sensores en caso de que otros hayan visto esto antes.

Aunque probablemente no sea particularmente influyente, puedo hacer que el servidor devuelva cualquier cosa, p.HTTP 204: No Content a una lista vacía de 200 / JSON, lo que sea que sea más fácil de atrapar el resultado en el autocompletado de jQueryUI.

Mi primer pensamiento es pasar una devolución de llamada con dos argumentos, a saber, un objeto de solicitud y unresponse callback para manejar el código, según la documentación:

La tercera variación, la devolución de llamada, proporciona la mayor flexibilidad y se puede utilizar para conectar cualquier fuente de datos a Autocompletar. La devolución de llamada obtiene dos argumentos:

Un objeto de solicitud, con una sola propiedad llamada "término", que se refiere al valor actualmente en la entrada de texto. Por ejemplo, cuando el usuario ingresó "nuevo yo" en un campo de ciudad, el término Autocompletar será igual a "nuevo yo".

Una devolución de llamada de respuesta, que espera que un solo argumento contenga los datos para sugerir al usuario. Estos datos deben filtrarse según el término proporcionado y pueden estar en cualquiera de los formatos descritos anteriormente para datos locales simples (String-Array u Object-Array con etiqueta / valor / ambas propiedades).

Cuando la devolución de llamada de respuesta no recibe datos, inserta devuelve una matriz de objetos especial de una línea que tiene una etiqueta y un indicador de que no hay datos (por lo que la selección / foco lo reconoce como el indicador de que no se devolvieron datos).

Esto parece demasiado complicado. Prefiero poder usar una fuente: "http: // ...", y simplemente recibir una devolución de llamada en algún lugar que indique que no se devolvieron datos.

,

Gracias por leer.

Brian

EDITAR:

Aquí hay una función de contenedor que creé para resolver esto, basada en la seguridad de @ ThiefMaster de que es la forma correcta de hacerlo:

    function autocomplete(input, source_url, on_select, on_focus, default_data) {
        /* Autocompletion for an input field
         * input: the field for autocompleting
         * source_url: the JSON url for getting data
         * on_select: function (event,ui) - when someone selects an element
         * on_focus: function (event, ui) - when someone focuses an element
         * default_data: function () returning default data; alternatively is the
         *               default dataset e.g. {'label':'X','value':'Y'}
         */

        $(input).autocomplete({
            source: function (request, response) {
                $.ajax({
                    url: source_url,
                    dataType: "json",
                    data: request,
                    success: function (data) {
                        if (!data.length) { // expect [] or ""
                            var def_data = typeof(default_data) == 'function' ?
                                default_data() : default_data;
                            response(def_data);
                        } else {
                            response(data);
                        }
                    }
                });
            },
            minLength: 3,
            select: on_select,
            focus: on_focus,
        });
    }

Respuestas a la pregunta(3)

Su respuesta a la pregunta