Typeahead.js 只匹配单词开头

5

我的Typeahead代码如下:

var events = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        limit: 100,
        prefetch: {
            url: Ajax.pluginurl + 'json/events.json',
            ttl: 1
        }
    });

    events.initialize();

    initialize_events_typeahead ();

    function initialize_events_typeahead () {
        $('.event_name').typeahead(null, {
            name: 'event',
            displayKey: 'name',
            source: events.ttAdapter(),
            templates: {
                empty: [
                    '<div class="empty-message">',
                    Ajax.no_results_found,
                    '</div>'
                ].join('\n'),
                suggestion: function(data){
                    return '<p><strong>' + data.name + '</strong> - ' + data.description + '</p>';
                }
            },
            engine: Hogan
        });


        $('.event_name').on("typeahead:selected typeahead:autocompleted", function(e,datum) {
            $(this).parent().parent().parent().parent().find('.event_description').val(datum.description);
        });
    }

由于某种原因,此代码仅匹配名称的开头。然而,在演示http://twitter.github.io/typeahead.js/examples/中,预取部分使用与我所见相同的代码时,即使在单词中间开始输入,它也会进行匹配。
如何修复这个问题? 谢谢
编辑:JSON 是:
[{"name":"P\u0159\u00edjezd host\u016f","description":"Cras ullamcorper ornare semper. Phasellus faucibus augue congue dapibus mollis. "},{"name":"Ob\u0159ad","description":"Curabitur fermentum diam quis viverra sodales. Phasellus sed sollicitudin magna, a dictum metus."},{"name":"Ve\u010dern\u00ed z\u00e1bava","description":"Curabitur fermentum diam quis viverra sodales."},{"name":"After-party","description":"Proin ipsum odio, vehicula vel diam a, dapibus suscipit velit. "},{"name":"Sn\u00eddan\u011b","description":"Proin ornare tempus ipsum at blandit. Nam hendrerit dolor et interdum vulputate."}]

请参见编辑后的问题。 - user1049961
1
嗯,我尝试去除特殊字符,但没有帮助。 - user1049961
是的!那么,当出现这种问题时,他们是如何做到的呢? - user1049961
用户不会在单词中间开始输入,因此您可能希望仅匹配开头。 - Nate
尝试这个解决方案:https://dev59.com/emEh5IYBdhLWcg3wwlu8 - DeadlyChambers
显示剩余3条评论
2个回答

11

我不确定为什么他们的样本显示中间单词匹配,但我猜测您应该开发自己的匹配算法(datumTokenizer)。

这是我的解决方案(暂时的,以防他们在Bloodhound引擎中默认实现某些内容):

var engine = new Bloodhound({

    datumTokenizer: function(d){
        var tokens = [];
        //the available string is 'name' in your datum
        var stringSize = d.name.length;
        //multiple combinations for every available size
        //(eg. dog = d, o, g, do, og, dog)
        for (var size = 1; size <= stringSize; size++){          
          for (var i = 0; i+size<= stringSize; i++){
              tokens.push(d.name.substr(i, size));
          }
        }

        return tokens;
    },...

1
那篇贴子救了我的命!我使用 Bloodhound 太受挫败了,它正在变成一场噩梦!像这样简单的东西不应该花费数小时的研究或代码调整。 - vegas2033

0
如果您预先知道可能会遇到的所有外语字符,则可以使用此处显示的建议规范化输入: Typeahead insensitive accent 但是,如果您不知道将要输入哪些字符,则可以使用此 JavaScript Unicode 6.3 规范化库:

https://github.com/walling/unorm

你可以使用客户端包管理器Bower进行安装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接