Typeahead Bloodhound POST 请求

Posted

技术标签:

【中文标题】Typeahead Bloodhound POST 请求【英文标题】:Typeahead Bloodhound POST request 【发布时间】:2014-03-16 07:27:44 【问题描述】:

我似乎无法获得远程查询以正确使用 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 数据选项中?

【问题讨论】:

***.com/a/46927923/3966458 没有 ajax 【参考方案1】:

你可以使用 $.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"

        
    
);

【讨论】:

虽然这段代码在应该调用 Ajax 方法的时候确实调用了它,但它没有正确设置 Content-Type,因此 ASP.NET MVC 至少不会解析发布的数据。 这将以“text/plain; charset=UTF-8”的内容类型发送,如果您希望它以 json 格式发送(如我 :D),您需要设置jqXhr 对象上的内容类型,如下所示: jqXhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); 由于您已经调用了替换,您可以使用它将查询存储到您在 beforeSend 中使用的局部变量中。它消除了与 queryInput 的耦合。 @Snekse 你能解释一下你的评论吗?我尝试在替换this.q = query 中添加一行并将queryInput.val() 替换为this.qthis.q 在调试器undefined 函数中显示为undefined 这个doesn't work anymore。 @Atropo 答案中的代码确实有效。【参考方案2】:

您可以将prepare 属性与remoteprefetch 一起使用,请注意函数签名会发生变化。 以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

【讨论】:

如果需要,您可以传递您的自定义data(例如,另一个字段的当前值等)。当前输入的值将在query 变量中【参考方案3】:

我发现holylaw 提到的ajax 'beforeSend' 方法效果最好。

不过,更改 url 也很重要。否则,Typeahead 不会费心提出另一个请求。所以我只是在网址末尾添加了一个虚假参数。像这样

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

这样,当打包的 ajax 数据发生变化时,我可以确保向服务器发出新的请求。

【讨论】:

以上是关于Typeahead Bloodhound POST 请求的主要内容,如果未能解决你的问题,请参考以下文章

typeahead.js:返回空查询的所有 Bloodhound 记录

Typeahead.js / Bloodhound 只显示一个结果 [重复]

Bootstrap Tokenfield 与 Typeahead / Bloodhound 排除令牌

Typeahead 和 Bloodhound - 如何获取 JSON 结果

使用 Django / Python 为 Typeahead / Bloodhound 提供远程 JSON 数据

我可以让 typeahead/bloodhound 始终显示用户正在输入的内容吗?