web-dev-qa-db-fra.com

Typeahead Bloodhound POST request

Je n'arrive pas à obtenir une requête à distance pour utiliser correctement 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 () n'obtient pas la valeur actuelle de l'objet, seule la valeur au moment où l'objet limier est instancié. Comment puis-je obtenir la chaîne de requête dans les options de données ajax?

17
Ablue

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"

        }
    }
});
16
holylaw

Vous pouvez utiliser la propriété prepare avec remote ou prefetch, sachez que la signature de la fonction 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;
                    }
                }
            });

N'oubliez pas qu'avec remote la signature de la fonction change avec function(query, settings).

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

11
Atropo

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

Il était toutefois important de modifier également l'URL. Sinon, Typeahead n'a pas pris la peine de faire une autre demande. J'ai donc ajouté un faux paramètre à la fin de l'URL. Comme ça

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

De cette façon, lorsque les données ajax emballées ont changé, on m'a assuré une nouvelle demande au serveur.

0
Jamie Popkin