2016-12-21 2 views
6

Я работал с typeahead.js и загружал данные, используя BloodHound remote.Предотвращение вызова ajax на пустые места typeahead.js

Everthing работает как ожидалось, за исключением случаев, когда я ввожу only spaces в textbox typeahead still sends ajax call.

Я хочу знать, есть ли способ prevent ajax call, если в текстовом поле only spaces. Я ищу аналогичное поведение, например trim.

Вот мой код. Я попытался использовать функцию prepare, но не повезло.

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

Почему это проблема для отправки вызова, когда есть пробелы? Предположительно, пользователь не получит никаких результатов. – ADyson

+0

Я хочу избежать сетевой поездки. – Mairaj

+3

сообщают, что сетевая поездка генерируется каждый раз, когда пользователь набирает _anything_, где имеется более 3 символов, и вероятность того, что пользователь на самом деле набрал 3 пустых пространства (они вряд ли будут думать, что он вернет что-нибудь!), Вы может принести много усилий и снизить сетевой трафик на 0,0001%. Просто сказать, что это кажется немного бессмысленным. Но если вы действительно этого захотите, вы можете создать настраиваемую функцию для атрибута 'source' и не допустить, чтобы запрос продвигался вперед в этой точке на основе условий поиска (и просто возвращал пустой массив). Документы typeahead показывают подпись метода – ADyson

ответ

1

Свойство remote имеет prepare функцию, которую вы можете использовать описатель эти изменения перед вызовом происходит по проводам.

В качестве примера:

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; 
      } 
     }, 
    }; 
} 

Обратите внимание, что в этом случае вы не поставить wildcard собственности, как это эффективно обобщающим для этого маркера замены.

+0

Это не мешает вызову. Это просто 'trim', что искали. – ndn

4

Я хотел бы попробовать подключая событие KeyUp в текстовом поле, чтобы выполнить фильтрацию:

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

Это будет срабатывать после второго места, которое должно смягчить нежелательное поведение, если нет, не являющиеся пробелов в поле.

+0

Я думаю, что это возможный способ – plonknimbuzz

+0

Даже если он работает, это не то решение, которое я ищу. Если вы уверены, что нет идиоматического способа сделать это, я предпочитаю это как ответ. – ndn