2014-02-18 90 views
19

請參閱下面的示例。Typeahead.js - 在多個屬性值中搜索

的jsfiddle:http://jsfiddle.net/R7UvH/2/

如何使在不止一個屬性值匹配typeahead.js(0.10.1)搜索?理想的情況下,內整datadata.titledata.desc和所有data.category[i].name

datumTokenizer: function(data) { 
    // **search in other property values; e.g. data.title & data.desc etc..** 
    return Bloodhound.tokenizers.whitespace(data.title); 
}, 

整體例如:

var data = [{ 
    title: "some title here", 
    desc: "some option here", 
    category: [{ 
     name: "category 1", 
    }, { 
     name: "categoy 2", 
    }] 
}, 
{ 
    title: "some title here", 
    desc: "some option here", 
    category: [{ 
     name: "category 1", 
    }, { 
     name: "categoy 2", 
    }] 
}]; 

var posts = new Bloodhound({ 
    datumTokenizer: function(data) { 
     // **search in other property values; e.g. data.title & data.desc etc..** 
     return Bloodhound.tokenizers.whitespace(data.title); 
    }, 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    local: data 
}); 
posts.initialize(); 

$('#search-input').typeahead({ 
    highlight: true 
}, { 
    name: 'Pages', 
    displayKey: 'title', 
    source: posts.ttAdapter(), 
    templates: { 
     header: '<h3>Pages</h3>' 
    } 
}); 

回答

5

我實現了這裏的解決方案:

http://jsfiddle.net/Fresh/4nnnG/

正如你有一個本地數據源,您需要創建單個數據集以使您能夠匹配多個數據集時間數據屬性。例如

$('#search-input').typeahead({ 
    highlight: true 
}, { 
    name: 'titles', 
    displayKey: 'title', 
    source: titles.ttAdapter() 
}, { 
    name: 'descs', 
    displayKey: 'desc', 
    source: descs.ttAdapter() 
}, { 
    name: 'cats', 
    displayKey: 'name', 
    source: cats.ttAdapter() 
}); 
+1

(^ _ *)Stay @Fresh – zee

+0

@NullSoulException:D –

+0

@Fresh感謝您抽出時間,它比我最初提出的稍微複雜。我正在使用多個源文件(這些源文件被分類爲頭文件 - 與每個typeahead.js多源文件示例http://twitter.github.io/typeahead.js/examples/完全相同)。你能指點我一個過濾器用法的例子嗎?請注意,我想保留標題(媒體,頁面,帖子)的分類。謝謝 – Iladarsda

13

return Bloodhound.tokenizers.whitespace(data.title)返回字符串數組。

所以,而不是返回該值:保存(和你的其他所需的值),然後將它們連接起來,並返回一個值...

x = Bloodhound.tokenizers.whitespace(data.title); 
y = Bloodhound.tokenizers.whitespace(data.desc); 
z = Bloodhound.tokenizers.whitespace(data.category[i].name); 
return x.concat(y).concat(z); 
22

Typeahead 0.10.3 added "support to object tokenizers for multiple property tokenization."

所以,你的榜樣變得

var posts = new Bloodhound({ 
    datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title', 'desc'), 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 
    local: data 
}); 

不過,我不認爲這會爲嵌套性工作你的情況,也就是說,data.category對象。請注意,如果您使用的是預取數據,請務必先清除本地存儲,否則新標記將不會生效(因爲在添加到搜索索引時使用datumTokenizer,並且如果數據爲已經出現在localStorage中,那麼搜索索引將不會被更新)。我被困在這一段時間了!

+1

在@timothy解決方案上工作了好幾天,但它對我沒有用。這個解決方案的工作原理更加優雅。 –

+1

偉大的解決方案,謝謝。注意,你可以用'prefetch:{cache:false,...}'來防止預取緩存' –

+0

這個方法可行,但是提醒:**你必須按照它們出現的順序在數據模式中指定屬性;否則,它將無法工作。我認爲這是一個前面的bug,因爲它對用戶來說是驚人的。 – toddmo