2017-01-14 46 views
0

拼命試圖弄清楚爲什麼自動完成不JSON的對象使用JSON事先鍵入的內容警犬自動完成着工作對象

(function($){ 

    let $country = $('#country'); 

    let countries = new Bloodhound({ 
     datumTokenizer: Bloodhound.tokenizers.whitespace, 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     prefetch: '../../data/countries.json' 
    }); 

    $country.typeahead({ 
     name: 'countries', 
     hint: true, 
     highlight: true, 
     minLength: 1 
    },{ 
     source: countries, 
     templates: { 
      empty: ['No data'].join('\n'), 
      suggestion: { 
       function (data) { 
        return '<ul><li>'+data.name+'</li></ul>'; 
       } 
      } 
     } 
    }); 

}(jQuery)); 

一切都與類似json的工作[「物品1」,「ITEM2」,「項目3」] 但沒有[{「name」:「item1」},{「name」:「item2」},{「name」:「item3」}]

我的json是正確的,我甚至試圖使用這一個: http://twitter.github.io/typeahead.js/data/nba.json

當使用關聯數組時總是得到「無數據」。

也試過這樣:

prefetch: { 
      url: '../../data/countries.json', 
      filter: function(list) { 
       return $.map(list, function(item) { 
        return { 
         name: item.name, 
         code: item.code 
        }; 
       }); 
      } 
     } 

數據預取是,但仍然沒有建議。

當然,在每次編輯之後,我都清理本地存儲。

使用把手

name: 'countries', 
     source: countries, 
     display: 'name', 
     templates: { 
      empty: ['No data'].join('\n'), 
      suggestion: Handlebars.compile('<p><strong>{{name}}</strong></p>') 
     } 

回答

0

好了,所以我figureout它,還不能確定也試過爲什麼...

datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.name); } 

而不是

datumTokenizer: Bloodhound.tokenizers.whitespace 

所以完整的工作代碼

(function($){ 

    let $country = $('#country'); 

    let countries = new Bloodhound({ 
     datumTokenizer: function (d) { return Bloodhound.tokenizers.whitespace(d.name); }, 
     queryTokenizer: Bloodhound.tokenizers.whitespace, 
     prefetch: { 
      url: '../../data/countries.json', 
      filter: function(list) { 
       return $.map(list, function(item) { 
        return { 
         name: item.name, 
         code: item.code 
        }; 
       }); 
      }, 
      cache: true 
     } 
    }); 

    $country.typeahead({ 
     name: 'countries', 
     hint: true, 
     highlight: true, 
     minLength: 1 
    },{ 
     source: countries, 
     display: function(data) { return data.name }, 
     templates: { 
      empty: ['No data'].join('\n'), 
      suggestion: function (data) { 
       return '<ul><li>'+data.name+'</li></ul>'; 
      } 
     } 
    }); 

}(jQuery)); 
+0

這可能不是一個完整的解釋。如果返回的JSON是一個字符串數組,它對於引擎來說非常簡單。否則Bloodhound建議引擎應該知道datumTokenizer,以便根據用戶查詢知道要建議的內容。在你的情況下,返回的JSON是一個對象數組。因此,搜索可以基於名稱或代碼。你在你的datumTokenizer中提供這些信息,以便相應地匹配建議。 – Surya

相關問題