【问题标题】:Twitter typeahead.js remote and search on clientTwitter typeahead.js 远程和客户端搜索
【发布时间】:2013-09-21 15:14:00
【问题描述】:

据我了解,typeahead.js 有三种获取数据的方式。

  • 本地:硬编码数据
  • 预取:加载本地 json 文件,或通过 URL 加载
  • 远程:向后端发送查询,以匹配结果进行响应

我想从后端获取所有数据,然后 在客户端处理它。 我的服务器响应的数据具有以下结构:

[{id:2, courseCode:IDA530, courseName:Software Testing, university:Lund University},
{id:1, courseCode:IDA321, courseName:Computer Security, university:Uppsala University}, ...]

我希望它搜索每个条目中的所有字段。 (id, courseCode, courseName, 大学)

我想在客户端上做更多的事情,并且仍然为每个用​​户获取一次(而不是每次用户输入),我可能在这里误解了一些东西,但请纠正我。

【问题讨论】:

    标签: ajax search twitter remote-server typeahead.js


    【解决方案1】:

    您应该重新阅读文档。基本上你需要两件事:

    1. 使用prefetch: 对象仅将所有数据从后端带到客户端一次(如果我理解正确,这就是您要查找的内容。)

    2. 使用filter 函数将这些结果转换为基准。返回的数据可以有一个tokens 字段,这将是预先搜索的内容,并且可以从您的所有数据中构建。

    类似的东西:

    $('input.twitter-search').typeahead([{
        name: 'courses',
        prefetch: {
            url: '/url-path-to-server-ajax-that-returns-data',
            filter: function(data) {
                retval = [];
                for (var i = 0;  i < data.length;  i++) {
                    retval.push({
                        value: data[i].courseCode,
                        tokens: [data[i].courseCode, data[i].courseName, data[i].university],
                        courseCode: data[i].courseCode,
                        courseName: data[i].courseName,
                        template: '<p>{{courseCode}} - {{courseName}}</p>',
                    });
                }
                return retval;
            }
        }
    }]);
    

    【讨论】:

    • 谢谢!很棒的代码 sn-p,让我眼前一亮。之前尝试过预取,但我没有让它工作。我只是将“int i”更改为“var i”并在 for 循环后返回 retval,它可以工作!
    • 欢迎 :) 啊。正确的。我仍然有点习惯'c',并输入了这个'blind'。将编辑回复。
    • 好吧,当我更深入地研究它时,我意识到我需要改变一些事情。它有时不起作用的原因是我在 chrome 的隐身窗口中,也许本地存储在那里关闭。我还必须添加一个模板引擎,例如“engine: Hogan”。我还将“模板:'

      {{courseCode}} - {{courseName}}

      '”从过滤器中移出并添加了“.join('')”
    • 我从一开始真正想要的是在每次页面加载(或在本地数据中未找到命中时)加载数据一次,而不是每次按键。现在,即使我刷新了页面,它也没有更新我的数据,所以如果添加了新课程,用户将永远无法识别它。但是,我添加了“localStorage.clear();”在我的文档准备功能中。这解决了它,但如果它在键入时找不到它,我宁愿让它重新加载数据。也许我可以为此使用遥控器?明天再看看,该睡觉了。
    • @nilsi:每页加载一次正是prefetch 的用途。如果您不指定 name: "courses"(即:根本不指定名称),那么它将不会保存在本地存储中,并且您将在每次页面重新加载时获得所有更新。
    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2021-01-07
    • 2011-05-28
    • 1970-01-01
    相关资源
    最近更新 更多