首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TypeAhead和猎犬只搜索JSON数组中的第一个单词

TypeAhead和猎犬只搜索JSON数组中的第一个单词
EN

Stack Overflow用户
提问于 2014-08-14 00:48:27
回答 1查看 1.8K关注 0票数 2

我正在使用TypeAhead为一个文本框提供自动补全结果。但似乎要么是猎犬,要么是TypeAhead只在我提供的JSON数组中搜索到的第一个单词。

JSON如下所示:

代码语言:javascript
复制
[
    {
        "name": "ALICE",
        "value": "ALICE",
        "physical_address": "ERF 270 CNR. OF THOMPSON AND INTWANA STREET, ALICE",
        "province": "PROVINCE",
        "tokens": [
            "ALICE",
            "PROVINCE",
            "ERF",
            "270",
            "CNR.",
            "OF",
            "THOMPSON",
            "AND",
            "INTWANA",
            "STREET",
            "ALICE"
        ]
    },
    {
        "name": "BUTTERWORTH",
        "value": "BUTTERWORTH",
        "physical_address": "SHOP NO. 1 MASONIC SHOPPING COMP, COR HIGH & BELL STREET BUTTERWORTH 4960",
        "province": "PROVINCE",
        "tokens": [
            "BUTTERWORTH",
            "PROVINCE",
            "SHOP",
            "NO.",
            "1",
            "MASONIC",
            "SHOPPING",
            "COMP",
            "COR",
            "HIGH",
            "&",
            "BELL",
            "STREET",
            "BUTTERWORTH",
            "4960"
        ]
    }
]

我将TypeAhead初始化如下:

HTML:

代码语言:javascript
复制
<div class="films">
    <input type="text" class="form-control typeahead" placeholder="Search" name="films" autocomplete="off" id="search">
</div>

Javascript:

代码语言:javascript
复制
/* TypeAhead invoked */
var _prefetch_url = $root_path + '/media/mod_storelocator/stores_json.php';

// constructs the suggestion engine
var films = new Bloodhound({
    datumTokenizer: function (d) {
        return Bloodhound.tokenizers.whitespace(d.value);
    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    limit: 15,
    prefetch: _prefetch_url
});

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

$('.films .typeahead').typeahead(null, {
    displayKey : 'value',
    source: films.ttAdapter(),
    templates: {
        suggestion: Handlebars.compile([
            '<p class="repo-language">{{province}}</p>',
            '<p class="repo-name">{{name}}</p>',
            '<p class="repo-description">{{physical_address}}</p>'
        ].join(''))
    }
});

我真的很感谢任何人的帮助/建议。

EN

回答 1

Stack Overflow用户

发布于 2014-08-14 05:44:09

您将d.value传入datumTokenizer,所以它只使用数组中每个元素的值对象。

还要注意的是,猎犬对数据本身进行了标记,因此您不需要在JSON中传回单个标记(即您不需要tokens对象)。

因此,我将其更改为使用猎犬来标记化数组中每个元素组合的valuephysical_address对象:

代码语言:javascript
复制
// constructs the suggestion engine
var films = new Bloodhound({
    datumTokenizer: function(d) { 
                      return Bloodhound.tokenizers.whitespace(d.name); 
                    },
    queryTokenizer: Bloodhound.tokenizers.whitespace,
    limit: 15,
    prefetch: {
       url: _prefetch_url,
       filter: function(list) {
          return $.map(list, 
                 function(element) { 
                         return { name: element.value + " " + element.physical_address }; 
                 });
       }
    }
});

我只能使用this fiddle在本地上下文中测试这一点,但是预取应该以相同的方式工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25291822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档