【问题标题】:typeahead, bloodhound : remote works but not prefetchtypeahead, bloodhound : 远程工作但不预取
【发布时间】:2014-05-09 16:13:43
【问题描述】:

我想使用预取,但我不能让它工作! 这是我的代码:

function initAutocompletion() {
    $("input[data-autocomplete-prefetch-url]").each(function () {
        var $this = $(this);
    var urlPrefetch = $this.data("autocomplete-prefetch-url");
    var prefetch;

    pref = {
        url: urlPrefetch,
        filter: filter
    };

    var bloodHound = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        limit: 10,
        prefetch: pref
    });

    bloodHound.initialize();

    $this
        .typeahead('destroy')
        .typeahead({
            hint: true,
            highlight: true,
            minLength: 1
        },
        {
            displayKey: 'value',
            source: bloodHound.ttAdapter()
        });
    });
 }

function filter(list) {
    return $.map(list, function (v) { return { value: v.toString() }; });
}

它不起作用。

如果我使用远程而不是预取它可以工作!

    var bloodHound = new Bloodhound({
        datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
        queryTokenizer: Bloodhound.tokenizers.whitespace,
        limit: 10,
        remote: pref
    });

我无法理解。

谁能帮帮我?

【问题讨论】:

    标签: typeahead prefetch bloodhound


    【解决方案1】:

    今天早上效果惊人! 所以它驱使我认为它是关于缓存的......而且它是! 在初始化寻血犬之前添加 clearPrefetchCache() 就可以了。

           bloodHound.clearPrefetchCache();
           bloodHound.initialize();
    

    我认为它没有显示任何建议,因为它缓存了一个空列表。

    【讨论】:

    • 没有clearPrefetchCache,预取的官方示例对我不起作用。在initialize 之前添加clearPrefetchCache 有帮助。虽然没有解释,但到底发生了什么。
    • 可能值得注意的是,这对于生产来说可能不是一个好主意,具体取决于您的应用程序,因为如果您在每次页面加载时清除预取缓存,则必须在每次页面加载时将数据重新加载到缓存中因此,您只能在切换页面或重新加载当前页面之前获得缓存的优势。不过,对于开发环境来说可能是个好主意。
    【解决方案2】:

    这是因为 typeahead 已经从预取 url 加载了您的数据并将其存储在 localStorage 中。当数据在localStorage 时,不调用预取。

    尝试更改cacheKey 预取选项,如下所示并重新加载页面。 Prefetch 将被调用,因为localStorage 中的新 cacheKey 没有数据绑定。

    var engine = new Bloodhound({
      datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
      queryTokenizer: Bloodhound.tokenizers.whitespace,
      prefetch: {
        url: "stations.json",
        cacheKey: "change here!"
      }
    });
    

    您还可以使用 chrome 开发者工具检查本地存储。

    尝试删除本地存储数据并重新加载页面。将调用预取。

    在 Bloodhound 初始化之前删除 localStorage 数据,在每次初始化时调用其预取。

    localStorage.removeItem("YOUR CACHEKEY");
    
    // Bloodhound initialization with YOUR CACHEKEY.
    

    我认为initialize() 之前的clearPrefetchCache() 更好。

    【讨论】:

    • .initialize(true) 也会在每次调用时清除缓存。
    • 很好的信息,但没有提供解决方案。
    • @Stuffix 我不这么认为。在我的测试环境中,我有.initialize(true)。如果我在初始化之前删除.clearPrefetchCache(),预取将停止访问我的服务器。从我的实验(0.11.1版)来看,如果你想清除预取缓存,你必须在.initialize(true)之前调用.clearPrefetchCache()
    • @davew 你可能是对的,我在 3 年前写了这条评论,所以从那以后事情可能会发生变化。从那以后,我就再也没有乱过输入法了。
    【解决方案3】:

    即使remote 工作正常,我在让prefetch 工作时遇到问题时遇到了你的问题。我首先解决了缓存问题(因为它之前一直是个问题),但它仍然无法正常工作。

    接下来,我在 typeahead 中实现了templates,这样当我在该字段中单击并输入时,我可以获得一些关于发生了什么的反馈,但什么也没发生。我的notFound 模板出现了。这看起来很奇怪,因为我可以看到预取命中了服务器。通过服务器上的调试输出,我还可以告诉服务器正在生成正确的 json 响应。

    在检查 json 时,虽然我注意到它没有空格,并且我的寻血犬 datumTokenizer 被配置为 Bloodhound.tokenizers.whitespace。这让我更深入地研究了标记器应该如何工作。

    我发现这很有帮助: https://github.com/twitter/typeahead.js/blob/master/doc/migration/0.10.0.md#tokenization-methods-must-be-provided

    切换到以下位置后我的问题得到解决:

    datumTokenizer: function(d) { return Bloodhound.tokenizers.whitespace(d.value);
    

    (其中.value是我要搜索的json属性)

    【讨论】:

    【解决方案4】:

    很可能,您尝试在 urlPrefetch 获取值之前预取数据。尝试将 urlPrefetch 转储到控制台并检查它是否具有有效的 url。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2021-10-25
      相关资源
      最近更新 更多