我使用sergeyt:typeahead
在我的meteor应用中创建了一个预先输入搜索字段。
现在我想记录所有搜索请求,以了解我的数据库中缺少哪些信息。问题是,用户可能不会按Enter键。由于typeahead-function,用户将键入一些字符,如果没有结果,则可能会中止键入。某些用户将删除输入以尝试其他关键字。如果技术上可行,我想获得这些信息。
首先,我必须检查typeahead给出的结果有多少,但我不知道从哪里获取这些信息。
到目前为止,这是我的代码:
Template.search.helpers({
searchData: function() {
return [
{
name: 'cat1',
valueKey: 'title',
displayKey: 'title',
header: '<h3 class="category-name">Category 1</h3>',
template: 'searchResults',
local: function() { return Collection.find().fetch(); }
}
]
},
selected: function(event, suggestion) {
if (Router.routes[suggestion.type] === void 0) {
console.warn('Route not found');
return;
}
else Router.go(suggestion.type, { _id : suggestion.id });
}
});
我会从该模板的事件开始:
Template.search.events({
'submit form': function(event, template) {
event.preventDefault();
var newElement = template.firstNode.children[0][1].value;
Log.insert({ title: newElement, missing: true });
},
'keyup input': function(event, template) {
var keyword = event.target.value;
Log.insert({ title: keyword });
}
});
submit-event:如果用户按Enter键,关键字将保存到集合中。但这是非常糟糕的,因为如果没有预先输出结果就会发生这种情况,因为用户可以选择一个建议,然后按回车键去寻找结果,但是我的代码会被覆盖... < / p>
keyup-event:问题是,将跟踪每个键事件。对于输入&#39;只是搜索&#39;,该集合将有14个插入。那不是我想要的。如果我正在使用更改事件,则输入必须变得模糊,这也不是我需要的。
所以在我看来这不是最好的方式。
也许可以使用typeahead.js的自定义事件,例如typeahead:render
。
答案 0 :(得分:0)
使用下划线的trottle仅每500毫秒左右保存一次搜索字符串。这将减少您保存的唯一搜索字符串的数量,同时仍然可以来回捕获大部分用户。
在你的情况下:
Template.search.events({
'submit form': _.throttle(function(event, template) {
event.preventDefault();
var newElement = template.firstNode.children[0][1].value;
Log.insert({ title: newElement, missing: true });
},500);
},
'keyup input': _.throttle(function(event, template) {
var keyword = event.target.value;
Log.insert({ title: keyword });
},500);
}
});
您的要求有点矛盾,所以这似乎是一个合理的妥协。您希望捕获搜索字符串,但不是捕获在搜索字符串的路上键入的每个字符。如果您没有限制并且用户键入:
f o o d
然后通常会保存4次搜索:
然后,如果他们决定退回一个角色,你会再次保存:
通过限制,假设用户键入相当正常的页面,您将保存两次搜索:
因为他们可能会想到他们用食物得到的结果,所以决定他们走得太远(至少500ms),然后退格。