2016-12-21 47 views
6

Pracowałem z typeahead.js i ładowałem dane za pomocą opcji BloodHound remote.Zapobieganie wywołaniom ajaxów na pustych polach typeahead.js

Wszystko działa zgodnie z oczekiwaniami, z tą różnicą, że po wprowadzeniu only spaces w stanie textbox nadal wpisuje się sends ajax call.

Chcę wiedzieć, czy istnieje sposób na prevent ajax call, jeśli w polu tekstowym jest only spaces. Szukam podobnych zachowań, takich jak trim.

Oto mój kod. Próbowałem użyć funkcji prepare, ale bez powodzenia.

var dataSource = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('ProductID', 'ProductName'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    remote: { 
       url: urlVar + "LoadAllProductByProductName/%QUERY", 
       wildcard: '%QUERY', 

      }, 
    sufficient: 3, 
    }); 

const $tagsInput = $('.txtProductName') 
$tagsInput.typeahead({ 
    minLength: 3, 
    source: dataSource, 
    hint: false, 
    highlight: true, 
    isBlankString: false 
    }, 
    { 
     limit: 10, 
     source: dataSource, 
     name: 'dataSource', 
     display: function (item) { 
     return item.ProductName 
     }, 
     suggestion: function (data) { 
     return '<div>' + data.ProductName + '–' + data.ProductID + '</div>' 
     }, 

}); 
+0

Dlaczego wysyłanie połączenia jest problematyczne, gdy dostępne są spacje? Prawdopodobnie użytkownik nie otrzyma żadnych wyników. – ADyson

+0

Chcę uniknąć podróży w sieci. – Mairaj

+3

dają, że wyzwolenie sieci jest generowane za każdym razem, gdy użytkownik wpisze _any_kwój_ tam, gdzie jest więcej niż 3 znaki, oraz szanse na to, że użytkownik wpisze 3 puste miejsca (prawdopodobnie nie będą one zwracać niczego!), może podjąć wiele wysiłku i zmniejszyć ruch w sieci o 0,0001%. Powiedzenie, że to trochę bez sensu. Ale jeśli naprawdę chcesz, możesz utworzyć niestandardową funkcję dla atrybutu 'source' i uniemożliwić żądanie kontynuacji w tym punkcie na podstawie wyszukiwanych terminów (i po prostu zwrócić pustą tablicę). Dokumenty nagłówkowe pokazują podpis metody – ADyson

Odpowiedz

1

Obiekt remote ma prepare funkcji, które można używać uchwytu tę zmianę przed wywołaniem dzieje nad drutu.

Jako przykład:

function createBloodHoundConfig(options) { 
    return { 
     datumTokenizer: Bloodhound.tokenizers.obj.whitespace('Name'), 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     identify: options.identify, 
     sufficient: 8, 
     remote: { 
      url: options.url, 
      prepare: function (query, settings) { 
       settings.url = settings.url.replace("{q}", query.trim()); 
       return settings; 
      } 
     }, 
    }; 
} 

Należy zauważyć, że w tym przypadku nie dostarczenia mienia wildcard, jak to jest w rzeczywistości skrótem robi tokenu wymiany.

+0

Nie przeszkadza to w wywołaniu. Po prostu "przycina" to, co jest poszukiwane. – ndn

4

Chciałbym spróbować dołączenie zdarzenie keyUp pola tekstowego do przeprowadzenia filtracji:

$tagsInput.keyup(function(){ 
     this.value = this.value.replace(/ */, ' '); 
    }); 

To będzie ogień po drugiej przestrzeni, co powinno zmniejszyć niepożądane zachowanie o ile nie istnieją znaki spoza przestrzeni w dziedzinie, jak również.

+0

Myślę, że to jest możliwy sposób. – plonknimbuzz

+0

Nawet jeśli to działa, nie jest to rodzaj rozwiązania, którego szukam. Jeśli jesteś pewien, że nie ma na to idiomatycznego sposobu, wolę to jako odpowiedź. – ndn