2014-02-17 78 views
17

我似乎無法得到正確使用POST的遠程查詢。Typeahead Bloodhound 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數據選項中?

+0

https://stackoverflow.com/a/46927923/3966458沒有Ajax –

回答

12

您可以使用$就

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" 

     } 
    } 
}); 
+0

儘管代碼調用Ajax的方法時,應該,不正確地設置Content-Type的,所以至少,ASP.NET MVC不解析發佈的數據。 – RickNZ

+2

這將發送一個內容類型的「text/plain; charset = UTF-8」,如果你希望它發送爲json(就像我:D),你需要設置jqXhr對象的內容類型所以: jqXhr.setRequestHeader('Content-Type','application/json; charset = UTF-8'); – Nashenas

+0

由於您已經在調用replace,因此可以使用它將查詢存儲到beforeSend中使用的局部變量。它刪除了與queryInput的耦合。 – Snekse

-1

beforeSend我找到了阿賈克斯beforeSend「的方法holylaw提到工作過的最好的。

雖然改變網址也很重要。否則,Typeahead不會再提出另一個請求。所以我只是在url的末尾添加了一個虛假參數。像這樣

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

這樣,當封裝的數據AJAX改變了我才放心新鮮的請求到服務器。

9

您可以使用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; 
        } 
       } 
      }); 

請記住,remotefunction(query, settings)函數簽名的變化。

參考:github.com/twitter/typeahead.js/issues/1236

+0

如果您需要(例如,另一個字段的當前值等),您可以傳遞您的自定義數據。當前鍵入的值將在'query'變量中 –