以下の例をご覧ください。
JSFiddle: http://jsfiddle.net/R7UvH/2/
typeahead.js (0.10.1)で複数のプロパティ値の一致を検索するにはどうすればよいですか?理想的には、全体data
(data.title
、data.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>'
}
});
Typeahead 0.10.3に「複数のプロパティのトークン化のためのオブジェクトトークナイザーのサポート」が追加されました。
だから、あなたの例は
var posts = new Bloodhound({
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('title', 'desc'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
local: data
});
ただし、これは、ネストされたプロパティ、つまりdata.category
オブジェクトでは機能しないと思います。
補足として、プリフェッチされたデータを使用している場合は、必ずローカルストレージをクリアしてください。そうしないと、新しいトークナイザーは有効になりません(検索インデックスに追加するときにdatumTokenizer
が使用されるため、はすでにlocalStorage
に存在するため、検索インデックスは更新されません)。しばらくこだわった!
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);
私はここに解決策を実装しました:
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()
});