Как начать точное совпадение в JQuery Autocomplete? - PullRequest
0 голосов
/ 04 апреля 2019

Я реализовал автозаполнение в своем приложении и использую поиск предложений Azure.Но в настоящее время он дает предложение, если совпадения найдены между строк.Но я хочу начать поиск с заданного термина, например, если я наберу Что это значит, то оно должно

  • что такое имя
  • что такое второе имя
  • чтоэто третье имя

, но в настоящее время оно возвращается как

  • Кстати, что такое
  • что такое имя
  • что такое второеимя

Пожалуйста, смотрите ниже код, который я использую

$("#autocomplete").autocomplete({
                    source: "/home/suggest?username=myname&",
                    minLength: 3                   
                });


$.ui.autocomplete.filter = function (source, term) {
            var matcher = new RegExp("^" + $.ui.autocomplete.escapeRegex(term), "i");
            return $.grep(source, function (value) {
                return matcher.test(value.label || value.value || value);
            });
        };

1 Ответ

0 голосов
/ 11 апреля 2019

Когда вы устанавливаете source в строку, автозаполнение не использует свою внутреннюю функцию filter.Чтобы выполнить фильтрацию после запроса, обработайте запрос самостоятельно:

source: function( request, response ) {
    var matcher = new RegExp( "^" + $.ui.autocomplete.escapeRegex( request.term ), "i" );

    if ( this.xhr ) {
        this.xhr.abort();
    }

    this.xhr = $.ajax( {
        url: "/home/suggest",
        data: $.extend({username:"myname"}, request),
        dataType: "json",
        success: function( data ) {
            response(
                $.grep( data, function( value ) {
                    return matcher.test( value.label || value.value || value );
                } )
            );
        },
        error: function() {
            response( [] );
        }
    } );
}

Объяснение:

filter не является частью API виджета.Вы не должны перезаписывать внутренние функции библиотеки без веской причины.

Вместо этого вручную обрабатывайте пост-фильтрацию с опцией source.Второй параметр response обеспечивает обратный вызов для любого результата, который вы хотите передать виджету.Обработайте вызов AJAX вручную, а затем обработайте результат, прежде чем передать его обратно response. См. Здесь объяснение того, как работает source.

Отказ от ответственности:

Это плохая практика. Сначала фильтрация выполняется на сервере, по срокам, потом по клиенту, по ^ сопоставителю.Он отправляет ненужные данные по сети.Это должно быть сделано в одной точке.Либо предварительно загрузите все данные на клиент, либо просто разрешите серверу обрабатывать фильтрацию.

Используйте это только в том случае, если у вас обоих нет доступа к коду сервера и вы не можете предварительно загрузить.

...