2014-02-27 53 views
17

默認微typeahead.js僅在一個字符串的開頭匹配的返回元件內,例如:微Typeahead.js如何返回所有匹配的元素的字符串

源:[「類型」,「預輸入」 '未來']

查詢: '類型'

回報: '類型' 和 '預輸入'

-

的問題: '提前實現'

回報:「進取」

我想它返回「提前」和「預輸入」

我的代碼:

var clients = new Bloodhound({ 
    datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value); }, 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    limit: 10, 
    prefetch: { 
     url: '/clients.json', 
     filter: function(list) { 
      return $.map(list, function(value) { return { name: value }; }); 
     } 
    } 
}); 

clients.initialize(); 

$('.client').typeahead(null, { 
    displayKey: 'value', 
    source: clients.ttAdapter(), 
    minLength: 1, 
}); 

已經有一個關於它的問題,但我不明白答案。

回答

39

我找到了一個解決方案...問題是我很習慣bootstrap2 typeahead,我不理解datumTokenizer的事情。如果別人覺得很難理解,我會在下面寫一點說明:

queryTokenizer:你正在查詢的單詞數組,如果你查詢'test abcd'它會將字符串轉換成['test',' abcd']而不是尋找與這兩個詞的匹配。

datumTokenizer:將與queryTokenizer匹配的單詞數組。您的JSON中的每件商品都會有一組要匹配的字詞。

所以,如果你有一個源:

[ '很好的測試', '壞測試']

和查詢 '估算'。你需要讓datumTokenizer返回一個包含'est'的數組,例如:

['good','test','ood','od','test','est','st'] for第一項

[「壞」,「廣告」,「測試」,「EST」,「ST」]第二項

貝婁是我寫的代碼,我不知道,如果它的最好的東西,但我認爲它會幫助無論如何:

new Bloodhound({ 
    datumTokenizer: function(d) { 
     var test = Bloodhound.tokenizers.whitespace(d.value); 
      $.each(test,function(k,v){ 
       i = 0; 
       while((i+1) < v.length){ 
        test.push(v.substr(i,v.length)); 
        i++; 
       } 
      }) 
      return test; 
     }, 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    limit: 10, 
    prefetch: { 
     url: '/lista.json', 
     ttl: 10000 
    } 
}); 
+1

考慮var i = 0;嚴格模式。否則絕對+1。 –

+1

爲我工作!謝謝! – jlars62

+0

這正是我想要做的。 –

相關問題