【问题标题】:Typeahead.js not showing custom template for prefetched dataTypeahead.js 未显示预取数据的自定义模板
【发布时间】:2015-02-19 22:04:53
【问题描述】:

我正在使用 Twitter 的 typeahead.js 来显示自动完成功能。

我的代码如下:

$.ajax({
    url:'/getlocals/',
    success: function(data){
        $('.local-type').typeahead({
            name: 'local-tt',
            source: data,
            suggestion: Handlebars.compile('<p><strong>{{locality}}</strong> – {{city}}</p>')
        })
    }
});

其中 data 是来自/getlocals/ 的 json 响应,格式如下:

[{
"locality": "Powai",
"city": "Mumbai",
}, {
"locality": "Colaba",
"city": "Mumbai",
}, {
"locality": "Andheri East",
"city": "Mumbai",
}, {
"locality": "Andheri West",
"city": "Mumbai",
}]

但这不起作用,我感觉source 选项没有收到正确的格式。 typeahead 正在寻找什么样的格式,我该如何提供?

编辑:

我还使用了此处提供的部分解决方案:Twitter Bootstrap Typeahead - Id & Label 但这似乎对我不起作用。

【问题讨论】:

  • @Daedalus 对不起,那是我写的结构,没有从响应中复制它。我已经编辑过了。
  • 谢谢;评论已过时,已删除。
  • @Daedalus 当然。有什么建议可以解决这个问题吗?我正在使用 Django 发送 data 变量,如果这有什么不同的话。
  • 目前正在重新创建的环境中调试您的问题。

标签: javascript jquery typeahead.js


【解决方案1】:

据我所知,阅读documentation,你在这个插件上做错了一些事情;

首先,您的插件使用不正确;选项在一个对象中指定,数据集在另一个对象中:

$('.local-type').typeahead({/*options*/}, {/*data set1*/}, {/*optional data set 2*/});

在你的例子中,它会是这样的:

$('.local-type').typeahead({
    name: 'local-tt',
}, {
    source: function (query, cb) {
        cb(data);
    },
    templates: {
        suggestion: Handlebars.compile('<p><strong>{{locality}}</strong> – {{city}}</p>')
    }
});

为了解释上述内容,“建议”键是“模板”键的子项,它不独立存在。 'source' 键是一个函数,而不是一个数组。该函数被传递给查询和“回调”函数,然后以数据作为参数执行。

其次,如果 ajax 调用执行了多次,那么在 ajax 调用中创建预输入插件实例的方法不是首选方法。如果不是,则忽略以下建议,即将 ajax 调用放在 typeahead 插件创建中,如下所示:

$('.local-type').typeahead({
    name: 'local-tt',
}, {
    source: function (query, cb) {
        $.ajax({
            url:'/getlocals/',
            success: function(data){
                cb(data);
            }
        });
    },
    templates: {
        empty: [
            '<div class="empty-message">',
            'unable to find any Best Picture winners that match the current query',
            '</div>'].join('\n'),
        suggestion: Handlebars.compile('<p><strong>{{locality}}</strong> – {{city}}</p>')
    }
});

这当然是假设 ajax 请求不止一次;如果不是,请忽略上述内容。

Basic demo

【讨论】:

  • 谢谢!我更喜欢这个解决方案而不是 cmets 中的那个。您已经很好地解释了它,现在我明白为什么我的代码不起作用了。 +1
  • @Newtt 乐于助人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2023-03-28
相关资源
最近更新 更多