我正在使用typeahead.js 0.9.3而且它正在游泳。我的问题是,是否可以在“typeahead:selected”事件(或任何事件)上删除数据集中的数据。
我在页面加载时使用Typeahead的prefetch
选项获取数据集中的数据。我知道我可以调用$('selector').typeahead('destroy')
并重新初始化typehead并在filter
对象中使用prefetch
,但似乎相当重要的是必须再次调用数据(我们'不要在本地存储中缓存数据)。
我想我正在寻找类似于filter
函数的东西来遍历基准数组并删除先前选择的(或所有选定的)基准。看起来没有类型的公共功能可以做到这一点,但也许我错过了它。
我已阅读过typeahead的文档并在此搜索但未找到答案。
编辑:我通过从prefetch
切换到local
并使用AJAX post
调用来获取数据,将其设置为全局变量然后将其传递给我来解决了当前问题typeahead
,我可以在其中添加/删除全局数据数据中的项目,然后根据需要销毁/重新生成typeahead。远非理想,但它确实有效。
答案 0 :(得分:12)
您可以在任何Bloodhound数据集上的Typeahead 0.10中实现此功能,无论是远程,预取还是本地。
只需跟踪独立于Bloodhound数据集选择的数据,不要使用Bloodhound#ttAdapater()
作为您的预先输入源。 ttAdapter方法只是Bloodhound#get(query, cb)
的包装器 - 所以不用它,而是使用自定义回调直接调用get(query, cb)
,该回调根据当前选择检查每个建议。
这是一个JSFiddle - http://jsfiddle.net/likeuntomurphy/tvp9Q/
var selected = [];
var select = function(e, datum, dataset) {
selected.push(datum.val);
$("#selected").text(JSON.stringify(selected));
$("input.typeahead").typeahead("val", "");
}
var filter = function(suggestions) {
return $.grep(suggestions, function(suggestion) {
return $.inArray(suggestion.val, selected) === -1;
});
}
var data = new Bloodhound({
name: 'animals',
local: [{ val: 'dog' }, { val: 'pig' }, { val: 'moose' }],
datumTokenizer: function(d) {
return Bloodhound.tokenizers.whitespace(d.val);
},
queryTokenizer: Bloodhound.tokenizers.whitespace,
// custom suggestion filter is applied after Bloodhound
// limits the set of possible suggestions
// see comment by Basti below
limit: Infinity
});
data.initialize();
$('input.typeahead').typeahead(null,
{
name: 'animals',
displayKey: 'val',
/* don't use
source: data.ttAdapter(), */
source: function(query, cb) {
data.get(query, function(suggestions) {
cb(filter(suggestions));
});
},
templates: {
empty: '<div class="empty-message">No matches.</div>'
}
}
).bind('typeahead:selected', select);
答案 1 :(得分:0)
正如你所指出的,如果没有大规模黑客攻击当前的类型版本,这是非常棘手的。 你需要3件事:
下一个预先版本(目前正在开发中的0.10)可能支持所需的功能 但是......我的(Svakinn)型前叉支持您需要的所有三种情况。 您的配置应提供getter函数,您可以从init数据中选择基准,并按查询字符串和已选择的选项对其进行过滤。
remote: yourGetterFunction
然后你需要禁用建议缓存:
skipCache: true
如果您不想等待下一次预先发布,我建议您尝试一下:
https://github.com/Svakinn/typeahead.js/tree/typeaheadSimple
还有现场实时JQuery和Knockout示例:
https://github.com/Svakinn/typeahead.js/blob/typeaheadSimple/Examples.md
答案 2 :(得分:-1)
尝试这个,这对我有用。
$('#selector').typeahead('setQuery', "");