当前位置: 首页 > 知识库问答 >
问题:

typeahead.js-匹配查询开始的结果

华谭三
2023-03-14

我使用Twittertypeahead.js搜索名单的名字和客户端希望根据名字的建议。

有没有一个选项可以让Twittertypeahead.js搜索查询与每个结果的开头相匹配,而不是字符串中的任何位置?

我可以在\u updateHint函数中看到一个beginsWithQuery变量,但是我不知道如何将其指定为一个选项,甚至不知道这是否与我试图实现的目标有关。

在我的项目中调用typeahead的jQuery函数是:

$( 'input[name="s"]' )
  .typeahead( {
      name: 'search',
      remote: wp_typeahead.ajaxurl + '?action=ajax_search&fn=get_ajax_search&terms=%QUERY',
      template: [
        '<p><a href="{{url}}">{{value}}</a></p>',
    ].join(''),
      engine: Hogan
  } )
);

我可以看到来自ajax_search的响应格式

[
  { "tokens" : [ "First","Last" ],
    "url" : "http://url/for/first-last/",
    "value" : "First Last" },
]

所以我需要弄清楚如何过滤这个JSON,以便只包含与搜索查询匹配的令牌[0]的数据。

编辑:根据下面@jharding的anwser,关于我必须添加哪些内容来实施预回迁解决方案工作的附加说明。

这是一个WordPress网站,该网站正在搜索的名称是自定义帖子类型“模型”的标题。我创建了一个名为list-all-models.php的文件,它以所需的数据格式输出html" target="_blank">模型名称的数组。

<?php
define('WP_USE_THEMES', false);
require('../../../../wp-load.php'); // depends on where this file is

$args = array (
    'post_type' => 'model',
    'orderby' => 'title',           
    'order' => 'asc',
    'posts_per_page' => -1
);

$models = get_posts($args);

$model_names = array();

foreach ($models as $i => $model) {
    $model_names[$i]['value']   = $model->post_title;
    $model_names[$i]['url']     = $model->guid;
    $model_names[$i]['tokens']  = explode(' ', $model->post_title);
}

header("Content-type: application/json");
die(json_encode($model_names));
?>

然后,我在预回迁选项中将此文件的URL用作URL参数。

现在搜索完全按照预期进行:)

共有2个答案

左丘智渊
2023-03-14

适当的解决办法是:

 matcher: function (item) {
                        if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) == 0) {
                            return true;
                        }
宰父才
2023-03-14

所以首先,typeahead.js不对Remote返回的数据进行任何过滤。预计Remote返回的数据已经包含了对给定查询的有效建议。

如果您希望typeahead.js处理查询的匹配建议,那么使用prefetch可能是一个更好的选择,因为您有大约700个条目,您应该会看到相当稳定的性能。如果你选择走这条路,你会想做这样的事情:

$('input[name="s"]').typeahead({
  name: 'search',
  prefetch: {
    url: '/path/to/json/file/that/returns/all/entries',
    filter: removeLastNameFromTokens
  },
  template: '<p><a href="{{url}}">{{value}}</a></p>',
  engine: Hogan
});

function removeLastNameFromTokens(data) {
  var datum, firstName;

  for (var i = 0; i < data.length; i++) {
    datum = data[i];
    datum.tokens.pop(); // assumes tokens looks like [First, Last]
  }

  return data;
}

假设/path/to/json/file/that/returns/all/entries指向包含一组数据的json文件,removeLastNameFromTokens将遍历每个数据,并从标记中删除姓氏,只留下名字。这将产生您想要的功能。

另一个好策略是结合使用预取远程。您可以在预回迁数据中包含大约100个最流行的条目,然后在预回迁无法产生足够的建议时,依靠远程来回填建议。

 类似资料:
  • 我有一个问题,当查询搜索进程与Firebase Rest API。我使用startAt和endAt参数进行第一次和最后一次搜索,但它仍然没有列出。 我有一个像上面这样的输出。有两批货名为白车和红车。当我找车的时候,我希望他们两个都出来。我哪里犯错了?

  • 问题内容: 我有一些文件: 我想要得到的结果,其匹配的任何值一样 在这种情况下,我想得到结果:一个数组: 我该怎么办?谢谢。 问题答案: 您应该看一下MongoDB 中的运算符。然后将它与find一起使用,以使您的请求更快,可以使用方法:使用它,mongoDB将返回JS对象而不是Mongoose模型/对象。 然后,您可以在结果数组上使用方法: 希望对您有帮助, 最好的问候

  • 我想用html制作datalist这里是一个例子 但是当我搜索“go”时,它会显示两个结果 null 我必须在MySQL中存储的5000多条记录上实现这一点。

  • 我正在尝试捕获异常,但无效。以下是我视图中的代码: 我还尝试了:“除了act_edit.DoesNotExist:”但错误仍然存在“活动匹配查询不存在”。你知道吗? 谢谢

  • 我有这样的桌子 数据如下所示,开始时间和结束时间是连续的时间跨度: 因此,如果用户传递两个参数,则可以在任意时间段内选择* 它应该以如下方式返回表: 你看,棘手的部分是将原始的时间跨度削减到用户定义的时间跨度(@from-@To),我已经为此奋斗了一整天。请指教。 提前非常感谢你!!!

  • 问题内容: 我想知道如何查询字段以完全匹配字符串。 我实际上正在尝试这样查询: 会返回以开头的所有字符串。 问题答案: 我遇到了类似的问题,而ifound修复了“ .raw”-在您的示例中,请尝试