Twitter Typeahead.js - 选择后删除数据

时间:2014-01-10 12:53:38

标签: javascript typeahead.js twitter-typeahead

我正在使用typeahead.js 0.9.3而且它正在游泳。我的问题是,是否可以在“typeahead:selected”事件(或任何事件)上删除数据集中的数据。

我在页面加载时使用Typeahead的prefetch选项获取数据集中的数据。我知道我可以调用$('selector').typeahead('destroy')并重新初始化typehead并在filter对象中使用prefetch,但似乎相当重要的是必须再次调用数据(我们'不要在本地存储中缓存数据)。

我想我正在寻找类似于filter函数的东西来遍历基准数组并删除先前选择的(或所有选定的)基准。看起来没有类型的公共功能可以做到这一点,但也许我错过了它。

我已阅读过typeahead的文档并在此搜索但未找到答案。

编辑:我通过从prefetch切换到local并使用AJAX post调用来获取数据,将其设置为全局变量然后将其传递给我来解决了当前问题typeahead,我可以在其中添加/删除全局数据数据中的项目,然后根据需要销毁/重新生成typeahead。远非理想,但它确实有效。

3 个答案:

答案 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件事:

  1. 远程作为功能选项(您可以在其中实现访问数据的自己的getter函数,过滤查询并删除您已选择的项目。
  2. 缓存控制:拒绝预先控制以使用缓存进行上次执行的建议搜索的功能。
  3. 点播建议搜索,仅在您需要时刷新建议结果(当您输入输入框并开始输入查询时)。
  4. 下一个预先版本(目前正在开发中的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', "");