Подтвердить что ты не робот

Запрос на POST

Я не могу заставить удаленный запрос правильно использовать 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() не получает текущее значение объекта только значение, которое в момент создания объекта ищейки. Как я могу получить строку запроса в параметрах данных ajax?

4b9b3361

Ответ 1

Вы можете использовать beforeSend $.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"

        }
    }
});

Ответ 2

Вы можете использовать свойство 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

Ответ 3

Я нашел метод ajax 'beforeSend', о котором говорил холайл, работал лучше всего.

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

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

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