Typeahead Bloodhound requête POST

Je n'arrive pas à obtenir une requête à distance pour utiliser POST correctement.

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()})
        }
    }
});

Le queryInput.val () n'obtient pas la valeur courante de l'objet seulement la valeur au moment où l'objet bloodhound est instancié. Comment puis-je obtenir la chaîne de requête dans les options de données ajax?

17
demandé sur Dhaulagiri 2014-02-17 09:46:40

3 réponses

Vous pouvez utiliser beforeSend de $.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"

        }
    }
});
14
répondu holylaw 2014-03-21 15:19:50

Vous pouvez utiliser le prepare propriété remote ou prefetch, notez que la fonction signature change. Un exemple avec 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;
                    }
                }
            });

Rappelez-vous que avec remote la signature de la fonction change avec function(query, settings).

référence: github.com/twitter/typeahead.js/issues/1236

11
répondu Atropo 2016-01-07 15:53:08

j'ai trouvé que la méthode ajax 'beforeSend' mentionnée par holylaw fonctionnait le mieux.

il était aussi important de modifier l'url. Sinon, Tapeahead n'a pas pris la peine de faire une autre demande. J'ai donc ajouté un paramètre bidon à la fin de l'url. Comme ceci

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

de Cette façon, lorsque les données ajax emballés changé, j'étais assuré une nouvelle requête au serveur.

-1
répondu Jamie Popkin 2014-06-03 22:31:32