4

当使用带有远程选项的 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()
});
4

2 回答 2

2

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

“所以我的想法是,我猜从远程返回的数据应该已经被远程过滤了,所以没有对其进行进一步的过滤。”

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

于 2015-02-03T16:38:06.350 回答
0

我希望更深入地探讨这个问题,以供将来参考。请记住,我不是 JavaScript 专家,也不是这方面的任何专家。对于Bloodhound引擎,它不适应与 a 的搜索参数的持续动态交互remote url。因此,如果您正在使用某些json文件,则预输入搜索框将仅显示limit. 因此,如果limit: 10然后json将显示数据的前 10 条记录,并且尽管用户键入,结果也不会改变。只有 json 的第一条记录会有基于用户提示的建议,这是微不足道的。

但是,如果remote源有一个query(例如,触发查询)获得所需结果,如本例所示,则每次填充搜索框时,搜索框都将填充相关结果。

那么,如果您有一个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,并且您已经与数据库建立了连接,因此您的搜索池将始终根据用户提示提供“相关结果”。

于 2015-04-24T04:21:19.430 回答