POST-запрос Typeahead Bloodhound

Кажется, я не могу получить удаленный запрос для правильного использования POST.

var creditors = new Bloodhound({
    datumTokenizer: function (d) {
        return Bloodhound.tokenizers.whitespace(d.value)
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
        url: "../getCreditors",
        replace: function(url, query) {
            return url + "#" + query;
        },
        ajax : {
            type: "POST",
            data: $.param({q: queryInput.val()})
        }
    }
});

queryInput.val() не получает текущее значение объекта, а только значение на момент создания экземпляра объекта Bloodhound. Как я могу получить строку запроса в параметрах данных ajax?


person Ablue    schedule 17.02.2014    source источник
comment
stackoverflow.com/a/46927923/3966458 без ajax   -  person Saahithyan Vigneswaran    schedule 25.10.2017


Ответы (3)


Вы можете использовать перед отправкой $.ajax

var creditors = new Bloodhound({
    datumTokenizer: function (d) {
        return Bloodhound.tokenizers.whitespace(d.value)
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    remote: {
        url: "../getCreditors",

        replace: function(url, query) {
            return url + "#" + query;
        },
        ajax : {
            beforeSend: function(jqXhr, settings){
               settings.data = $.param({q: queryInput.val()})
            },
            type: "POST"

        }
    }
});
person holylaw    schedule 21.03.2014
comment
Хотя этот код вызывает метод Ajax, когда это необходимо, он неправильно устанавливает Content-Type, поэтому ASP.NET MVC, по крайней мере, не анализирует отправленные данные. - person RickNZ; 09.04.2014
comment
Это будет отправлено с типом содержимого text/plain; charset=UTF-8, если вы хотите, чтобы он отправлялся как json (как я: D), вам нужно установить тип контента для объекта jqXhr следующим образом: jqXhr.setRequestHeader('Content-Type', 'application/json ;кодировка=UTF-8'); - person Nashenas; 24.04.2014
comment
Поскольку вы уже вызываете замену, вы можете использовать ее для сохранения запроса в локальной переменной, которую вы используете в beforeSend. Он удаляет связь с queryInput. - person Snekse; 29.04.2014
comment
@Snekse Можете ли вы немного объяснить свой комментарий? Я попытался добавить строку в замену this.q = query и заменить queryInput.val() на this.q, но this.q отображается как undefined в функции отладчика beforeSend. - person Adam; 06.08.2014
comment
Этот больше не работает. Код в ответе @Atropo работает. - person aexl; 07.01.2016

Вы можете использовать свойство prepare с remote или prefetch, помните, что сигнатура функции меняется. Пример с prefetch:

var Bloodhound = new Bloodhound({
                datumTokenizer: Bloodhound.tokenizers.whitespace,
                queryTokenizer: Bloodhound.tokenizers.whitespace,
                prefetch: {
                    url: remote,
                    prepare: function (settings) {
                        settings.type = "POST";
                        settings.contentType = "application/json; charset=UTF-8";
                        return settings;
                    },
                    remote: function (query, settings) {
                        settings.type = "POST";
                        settings.data = {q: query, foo: 'bar'}; // you can pass some data if you need to
                        return settings;
                    }
                }
            });

Помните, что с remote сигнатура функции меняется с function(query, settings).

Для справки: github.com/twitter/typeahead.js/issues/1236

person Atropo    schedule 26.06.2015
comment
Вы можете передать свой собственный data, если вам нужно (например, текущее значение другого поля и т. д.). Текущее введенное значение будет в переменной query - person aexl; 07.01.2016

Я обнаружил, что метод ajax 'beforeSend', упомянутый Holylaw, работает лучше всего.

Однако было важно также изменить URL-адрес. В противном случае Typeahead не стал бы делать еще один запрос. Поэтому я просто добавил фиктивный параметр в конце URL-адреса. Как это

http://mylittleservice.com?blah=%QUERY

Таким образом, когда пакет данных ajax изменился, я получил новый запрос на сервер.

person Jamie Popkin    schedule 03.06.2014