代码之家  ›  专栏  ›  技术社区  ›  nilsi

Twitter typeahead.js远程和客户端搜索

  •  1
  • nilsi  · 技术社区  · 11 年前

    据我所知,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,课程代码,课程名称,大学)

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

    1 回复  |  直到 11 年前
        1
  •  3
  •   Nitzan Shaked    11 年前

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

    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;
            }
        }
    }]);