您可以在任何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);
爲什麼不將其傳遞到預輸入前幾個過濾數據? –
因爲沒有任何機制可以在不調用'.typeahead('destroy')'的情況下對其進行「重新過濾」,並用另一個'prefetch'調用重新初始化'typeahead'。我不希望在'typeahead:selected'事件發生後'POST'。 – rpmartz