默认情况下,Typeahead 2.x 不允许存储或加载 JSON 数据。看起来您正在尝试在您的highlighter
方法中解决这个问题JSON.parse
,但您可以覆盖一些类似于不同问题的方法。
您可以覆盖 Typeahead 中的几乎任何方法,但是您必须作弊才能对render
and执行此操作select
,您需要将其从使用更改为attr('data-value' ...)
,data('value' ...)
就像我在另一个答案中所做的那样。
除此之外,您必须更改主动接触 JSON 对象的每一个方法:highlighter
、matcher
、sorter
和updater
.
因为您只想在突出显示中显示名称,所以您可以通过对上一个问题进行一些highlighter
修改来避免更改render
:
typeahead.render = function(items) {
var that = this
items = $(items).map(function (i, item) {
i = $(that.options.item).data('value', item) // <- modified for data
i.find('a').html(that.highlighter(item.name)) // <- modified for .name
return i[0]
});
items.first().addClass('active')
this.$menu.html(items)
return this
};
忽略select
我在另一个答案中显示的 ,您仍然需要覆盖matcher
、sorter
和updater
,其中包括highlighter
,都可以通过传入的选项来完成:
var typeahead = $("#mytypeahead").typeahead({
matcher: function (item) {
return ~item.name.toLowerCase().indexOf(this.query.toLowerCase())
},
sorter: function (items) {
var beginswith = []
, caseSensitive = []
, caseInsensitive = []
, item
while (item = items.shift()) {
if (!item.name.toLowerCase().indexOf(this.query.toLowerCase())) beginswith.push(item)
else if (~item.name.indexOf(this.query)) caseSensitive.push(item)
// NOTE: they assume, by default, that all results contain the text
else caseInsensitive.push(item)
}
return beginswith.concat(caseSensitive, caseInsensitive)
},
updater: function(item) {
// NOTE: this is called when the user picks the option, so you can also
// use item.url here
return item.name
}
});
sorter
在您覆盖的source
方法调用之后调用process
,这会启动其他所有操作。