Typeahead Bloodhound POST请求

Abl*_*lue 17 jquery typeahead typeahead.js twitter-typeahead

我似乎无法获得正确使用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()})
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

queryInput.val()只获取对象的当前值,而不是实例化bloodhound对象时的值.如何将查询字符串放入ajax数据选项中?

小智 16

你可以使用$ .ajax的beforeSend

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"

        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 这将发送内容类型为"text/plain; charset = UTF-8",如果你希望它以json(像我:D)发送,你需要在jqXhr对象上设置内容类型,如此:jqXhr.setRequestHeader('Content-Type','application/json; charset = UTF-8'); (2认同)

Atr*_*opo 11

您可以使用该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;
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

请记住,随着remote功能签名的变化function(query, settings).

供参考:github.com/twitter/typeahead.js/issues/1236