Twitter Typeahed 0.11.1 只显示一个结果
Twitter Typeahed 0.11.1 only showing one result
我正在尝试使用 searchkick 在我的数据库中查找一个人。当用户从下拉列表中选择一个人时,它会将此人的 ID 放入隐藏字段中,这就是提交的值。
那部分工作正常(大部分)。
我遇到的问题是,如果结果少于五个,则预先输入仅在下拉列表中显示一个值(第一个 searchkick returns)。如果结果超过五个,则下拉列表不会显示。
这是我的人物模型:
searchkick text_start: [:first_name, :middle_name, :last_name]
def search_data
as_json only: [:first_name, :last_name, :middle_name, :active]
end
def full_name
"#{first_name} #{middle_name} #{last_name}"
end
我的人员控制器:
def person_search
render json: Person.search(params[:query],
fields: [{first_name: :text_start}, {last_name: :text_start}, {middle_name: :text_start}],
where:{active:true},
limit: 5).map {|person| {name: person.full_name, value: person.id}}
end
我的表单视图:
<%= simple_form_for(@person) do |f| %>
<% if @person %>
<%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', value: @person.full_name} %>
<% else %>
<%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', placeholder: "No Person Selected"} %>
<% end %>
<%= f.input :person_id, as: :hidden%>
<% end %>
我的搜索 js:
var ready;
ready = function() {
var people = new Bloodhound({
identify: function(obj) { return obj.value;},
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/people/person_search?query=%QUERY',
wildcard: '%QUERY'
}
});
$('.person-typeahead').typeahead(null, {
display: 'name',
source: people
}).on('typeahead:selected', onPersonSelected);
// show name and submit id
function onPersonSelected($e, datum) {
$('#person_id').val(datum.value);
}
};
$(document).ready(ready);
$(document).on('page:load', ready);
如果有人能更好地向我解释 bloodhound(分词器和识别函数的作用),这也会有所帮助。
我已经浏览了几个小时的文档,但没有点击。
奖金问题:
假设我在数据库中有多个约翰。
- 约翰·史密斯
- 李四
- 约翰·斯诺
当我搜索 John(这是在 0.10 上)时,下拉列表显示了所有三个,但是当我按下 space 并开始输入姓氏时,searchkick returns 什么都没有,所有结果都消失了.
有没有办法用 Searchkick 做到这一点?
看来是typeahead的问题。我在这里找到了解决方案:
https://github.com/twitter/typeahead.js/issues/1218
我做了这个并为我修复了它:
https://github.com/per-nilsson/typeahead.js/commit/387290b1e70be0052c6dd9be84069f55d54a7ce7
我正在尝试使用 searchkick 在我的数据库中查找一个人。当用户从下拉列表中选择一个人时,它会将此人的 ID 放入隐藏字段中,这就是提交的值。
那部分工作正常(大部分)。
我遇到的问题是,如果结果少于五个,则预先输入仅在下拉列表中显示一个值(第一个 searchkick returns)。如果结果超过五个,则下拉列表不会显示。
这是我的人物模型:
searchkick text_start: [:first_name, :middle_name, :last_name]
def search_data
as_json only: [:first_name, :last_name, :middle_name, :active]
end
def full_name
"#{first_name} #{middle_name} #{last_name}"
end
我的人员控制器:
def person_search
render json: Person.search(params[:query],
fields: [{first_name: :text_start}, {last_name: :text_start}, {middle_name: :text_start}],
where:{active:true},
limit: 5).map {|person| {name: person.full_name, value: person.id}}
end
我的表单视图:
<%= simple_form_for(@person) do |f| %>
<% if @person %>
<%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', value: @person.full_name} %>
<% else %>
<%= f.input :person_search, as: :fake, label: 'Person', input_html: {class: 'form-control person-typeahead', placeholder: "No Person Selected"} %>
<% end %>
<%= f.input :person_id, as: :hidden%>
<% end %>
我的搜索 js:
var ready;
ready = function() {
var people = new Bloodhound({
identify: function(obj) { return obj.value;},
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name', 'value'),
queryTokenizer: Bloodhound.tokenizers.whitespace,
remote: {
url: '/people/person_search?query=%QUERY',
wildcard: '%QUERY'
}
});
$('.person-typeahead').typeahead(null, {
display: 'name',
source: people
}).on('typeahead:selected', onPersonSelected);
// show name and submit id
function onPersonSelected($e, datum) {
$('#person_id').val(datum.value);
}
};
$(document).ready(ready);
$(document).on('page:load', ready);
如果有人能更好地向我解释 bloodhound(分词器和识别函数的作用),这也会有所帮助。
我已经浏览了几个小时的文档,但没有点击。
奖金问题: 假设我在数据库中有多个约翰。
- 约翰·史密斯
- 李四
- 约翰·斯诺
当我搜索 John(这是在 0.10 上)时,下拉列表显示了所有三个,但是当我按下 space 并开始输入姓氏时,searchkick returns 什么都没有,所有结果都消失了. 有没有办法用 Searchkick 做到这一点?
看来是typeahead的问题。我在这里找到了解决方案:
https://github.com/twitter/typeahead.js/issues/1218
我做了这个并为我修复了它:
https://github.com/per-nilsson/typeahead.js/commit/387290b1e70be0052c6dd9be84069f55d54a7ce7