Twitter Typeahead.js&Bloodhound远程搜索始终返回相同结果问题
兄弟,我帮你梳理下这种情况大概率是哪几个环节出问题了:
1. 后端接口没处理搜索参数
这是最常见的原因!当你用远程模式时,前端组件一般会把用户输入的关键词作为参数传给后端,但如果你的后端根本没接收这个参数,或者没写根据参数筛选数据的逻辑,那不管你输入啥,后端都会返回全量数据,自然不会有筛选效果。
举个例子:假设前端每次请求都会带?keyword=你输入的内容,但后端接口完全没读这个keyword参数,直接把所有数据返回,那肯定每次结果都一样。你可以先在Postman或者浏览器地址栏里手动调用接口,带不同参数试试,比如xxx.com/api?keyword=abc和xxx.com/api?keyword=def,看返回结果有没有区别——如果没区别,那百分百是后端的锅。
2. 前端参数传递配错了
有些组件的remote配置需要你指定“怎么把用户输入转换成接口参数”,比如transform函数或者参数映射。要是这里写错了,后端拿不到正确的搜索关键词,也会返回全量数据。
比如组件默认会把输入内容放到search参数里,但你在transform里硬改成了q,可后端期望的参数名是search,那等于后端没拿到筛选条件,结果当然不会变。这种情况你可以打开浏览器的Network面板,看每次输入时发送的请求URL,检查参数是不是正确带过去了。
3. 接口响应的处理逻辑错了
虽然你把rows赋值给local变量能正常用,但远程返回的JSON结构可能和你预期的不一样?比如后端返回的是{ data: { rows: [...] } },但你的transform函数没正确提取rows数组,反而返回了整个response对象,或者固定返回某个值,那组件拿到的始终是同一批数据。
4. 缓存在搞鬼
要是后端接口开了强缓存,或者前端给请求加了缓存,那即使你输入变化,浏览器也会直接读缓存里的全量数据,不会发新请求去拿筛选后的结果。这种情况你可以看请求的Response Headers里的Cache-Control字段,或者在请求URL后面加个随机时间戳参数(比如&t=123456)来绕过缓存试试。
内容的提问来源于stack exchange,提问作者Bradley

