2014-02-17 10 views
17

Ich kann nicht scheinen, eine Fernabfrage zu erhalten, um POST richtig zu verwenden.Typeahead Bloodhound POST-Anfrage

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()}) 
     } 
    } 
}); 

die queryInput.val() den aktuellen Wert des Objekts erhält nicht nur der Wert am Bluthund Objektzeit instanziiert. Wie kann ich die Abfragezeichenkette in die ajax Datenoptionen erhalten?

+0

https://stackoverflow.com/a/46927923/3966458 ohne Ajax –

Antwort

12

Sie können beforeSend von $ verwenden .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" 

     } 
    } 
}); 
+0

Obwohl dieser Code die Ajax-Methode tut nennen, wenn es sollte, es, richtig Content-Type gesetzt nicht so Mindestens ASP.NET MVC analysiert die veröffentlichten Daten nicht. – RickNZ

+2

Dies wird mit einem Inhaltstyp von "text/plain; charset = UTF-8" gesendet, wenn Sie möchten, dass es als json (wie ich: D) senden, müssen Sie den Inhaltstyp auf dem jqXhr Objekt wie einstellen also: jqXhr.setRequestHeader ('Inhaltstyp', 'application/json; charset = UTF-8'); – Nashenas

+0

Da Sie bereits replace aufrufen, können Sie diese Abfrage verwenden, um die Abfrage in einer lokalen Variablen zu speichern, die Sie in vor dem Senden verwenden. Es entfernt die Kopplung zu QueryInput. – Snekse

-1

ich die Ajax 'beforeSend' Methode gefunden holylaw die am besten funktioniert erwähnt.

Es war wichtig, die URL auch zu ändern. Ansonsten machte sich Typeahead keine weiteren Fragen. Also habe ich einfach einen falschen Parameter am Ende der URL hinzugefügt. Gefallen Sie diese

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

Auf diese Weise, wenn die verpackten Ajax-Daten geändert wurde ich eine neue Anfrage an den Server gewährleistet.

9

Sie können die prepare Eigenschaft mit remote oder prefetch verwenden, beachten Sie, dass die Funktion Signatur ändert. Ein Beispiel mit 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; 
        } 
       } 
      }); 

dass Denken Sie daran, mit remote die Funktionssignatur Änderungen mit function(query, settings).

Zum Vergleich: github.com/twitter/typeahead.js/issues/1236

+0

Sie können Ihre benutzerdefinierten Daten übergeben, wenn Sie dies benötigen (z. B. den aktuellen Wert eines anderen Felds usw.). Der aktuelle eingegebene Wert befindet sich in der Variablen query –

Verwandte Themen