Typeahead和Bloodhound在远程'远程'用来

时间:2015-01-29 19:23:56

标签: javascript jquery typeahead.js bloodhound

当使用具有远程选项的Typeahead / Bloodhound时,当本地/预取结果低于"限制" (5)显示的建议与输入无关。看起来喜欢它只是从结果设置的顶部显示为5。

照片:'爱情'是预期的结果,其他一切都是无关的:

我的代码:

    var keywords = [
 {"value": "Ambient"}, {"value": "Blues"},{"value":  "Cinematic"},{"value":  "Classical"},{"value": "Country"},
 {"value": "Electronic"},{"value": "Holiday"},{"value": "Jazz"},{"value": "Lounge"},{"value": "Folk"},
  {"value": "Hip Hop"},{"value": "Indie"},{"value": "Pop"},{"value": "Post Rock"},{"value": "Rock"},{"value": "Singer-Songwriter"},{"value": "Soul"},
  {"value": "World"},{"value": "Happy"},{"value": "Sad"},{"value": "Love"},{"value": "Angry"},
  {"value":"Joy"},{"value": "Delight"},{"value": "Light"},{"value": "Dark"},{"value": "Religious"},{"value": "Driving"},
  {"value":"Excited"},{"value": "Yummy"},{"value": "Delicious"},{"value": "Fun"},{"value": "Rage"},
  {"value":"Hard"},{"value": "Soft"}
  ];


// Instantiate the Bloodhound suggestion engine
var keywordsEngine = new Bloodhound({
    datumTokenizer: function (datum) {
        return Bloodhound.tokenizers.whitespace(datum.value);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    local: keywords,
    remote: {
        url: '/stub/keywords.json',
        filter: function (keywords) {
            // Map the remote source JSON array to a JavaScript object array
            return $.map(keywords, function (keyword) {
                return {
                    value: keyword.value
                };
            });
        }
    },
    prefetch: {
        url: '/stub/keywords.json',
        filter: function (keywords) {
            // Map the remote source JSON array to a JavaScript object array
            return $.map(keywords, function (keyword) {
                return {
                    value: keyword.value
                };
            });
        }
    }
});

// kicks off the loading/processing of `local` and `prefetch`
keywordsEngine.initialize();

$('#keyword-search-input').typeahead({
  hint: true,
  highlight: true,
  minLength: 1
},
{
  name: 'keyword',
  displayKey: 'value',
  // `ttAdapter` wraps the suggestion engine in an adapter that
  // is compatible with the typeahead jQuery plugin
  source: keywordsEngine.ttAdapter()
});

2 个答案:

答案 0 :(得分:2)

经过进一步研究,我认为我需要手动过滤远程建议,根据Github问题对于Typeahead.js的这个帖子:

“所以我想这个想法是从遥控器返回的数据应该已经被遥控器过滤掉了,所以不再对它进行过滤。”

https://github.com/twitter/typeahead.js/issues/148

答案 1 :(得分:0)

我希望更深入地研究这个问题以供将来参考。请记住,我不是JavaScript专家或任何专家。使用Bloodhound引擎时,它无法与remote url的搜索参数进行持续的动态交互。因此,如果您使用的是某个json文件,则预先搜索框将仅显示limit。因此,如果limit: 10,那么将显示json数据的前10条记录,并且尽管用户输入,结果也不会改变。只有json的第一条记录会根据用户提示提出建议,这是一件小事。

但是,如果remote来源有query(例如,点击查询)获得所需结果as in this example,则每次搜索时搜索框都会填充相关结果框已填充。

那么如果你有一个很大的json文件,你是从某个数据库生成的,而不是使用prefecth怎么办?显然,为了提高速度和效率,您需要使用remote。使用PHP脚本,您需要执行以下操作:

$key=$_GET['key'];
$con=mysqli_connect("localhost","root","");
$db=mysqli_select_db($con, "database_name");
$query=mysqli_query($con, "SELECT * FROM table WHERE column LIKE '%{$key}%'");
$rows=array();
while($row=mysqli_fetch_assoc($query))
{
  $rows[] = $row; 
}
echo json_encode($rows);        

在这里,您使用GET获取搜索参数的值,并且您已与数据库建立了连接,因此您的搜索池将始终使用"相关结果"根据用户提示。