web-dev-qa-db-ja.com

Typeahead Bloodhound POST request

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()はオブジェクトの現在の値を取得せず、bloodhoundオブジェクトがインスタンス化されたときの値のみを取得します。クエリ文字列をajaxデータオプションに取り込むにはどうすればよいですか?

17
Ablue

$ .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"

        }
    }
});
16
holylaw

関数のシグネチャが変更されることに注意して、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

11
Atropo

言及したajaxの「beforeSend」メソッドholylawが最も効果的であることがわかりました。

ただし、URLを変更することも重要でした。それ以外の場合、Typeaheadは別の要求を行う必要はありませんでした。だから私はちょうどURLの最後に偽のパラメータを追加しました。このような

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

そうすることで、パッケージ化されたajaxデータが変更されたときに、サーバーへの新しい要求が保証されました。

0
Jamie Popkin