我有一堆字段(名字、姓氏等),我希望能够将任何已填充或部分填充的值传递给自动完成服务器端,以便我可以在查询中使用它们。
问问题
883 次
1 回答
0
我通过在关注各个字段的任何更改或自动完成“选择”事件上更新自动完成“源”来做到这一点。
jQuery('#people_new_user input[type="text"]').each(
function(index, element) {
var field = element.name;
jQuery(element)
.focus(setSourceUser)
.autocomplete({
source: "/cf/AutoComplete/People?current="+field,
select: selectUser
});
});
上面的代码设置了一个名为“setSourceUser”的“focus”事件处理程序和一个名为“selectUser”的自动完成“select”事件处理程序。
function setSourceUser(event)
{
var endPart = "";
jQuery('#people_new_user input[type="text"]').each(
function(index, ielement) {
var ifield = ielement.name;
var ival = ielement.value;
if (ival != '')
{
endPart += '&field=' + ifield;
endPart += '&value=' + ival;
}
}).each(
function(index, element) {
var field = element.name;
jQuery(element)
.autocomplete("option", "source",
"/cf/AutoComplete/People?current="+field+endPart);
});
}
上面的“setSourceUser”函数从所有字段中获取所有值(在第一个“each”函数中)并为源构建一个“endPart”,然后为每个字段设置自动完成“源”选项。我不会显示“select”回调,因为它会执行与此问题无关的其他内容,然后调用“setSourceUser”。源最终类似于/cf/AutoComplete/People?current=last_name&field=first_name&value=p&field=last_name&value=tomblin
自动完成本身提供的“术语”值。
在服务器端,我的函数(在这种情况下是用 Mason 和 Perl 编写的)在“LIKE”sql 语句中使用&field=foo&value=bar
对(跳过其中 field == current 的那些,因为自动完成在 中传递了更当前的值)。term
然后我以 JSON 格式返回找到的结果。(如果有超过 50 个结果,我不会打扰,因为列表会太长。)
% $r->content_type('application/json');
<% JSON::to_json( \@suggestions, { utf8 => 1, allow_blessed => 1,
convert_blessed => 1, } ) |n %>
% $m->abort;
<%ARGS>
@field => undef
@value => undef
$current => undef
$term => undef
</%ARGS>
<%INIT>
use RTx::SearchBuilder::Records::Peoples;
$current =~ s/people_//g;
my $people = RTx::SearchBuilder::Records::Peoples->new(Handle => CFHandle());
my $fn = scalar(@field);
for my $i (0...$fn-1)
{
my $f = $field[$i];
next if !defined($f);
my $v = $value[$i];
if ($f ne $current)
{
$people->Limit(
FIELD => $f,
OPERATOR => 'LIKE',
VALUE => '%'.$v.'%',
ENTRYAGGREGATOR => 'AND');
}
}
$people->Limit(
FIELD => $current,
OPERATOR => 'LIKE',
VALUE => '%'.$term.'%',
ENTRYAGGREGATOR => 'AND');
my @suggestions;
# If there are too many results, skip it and make them narrow it down a bit
# more
if ($people->Count < 50)
{
while (my $person = $people->Next)
{
my $suggestion = { label => $person->$current, value => $person };
push @suggestions, $suggestion;
}
}
</%INIT>
于 2012-06-08T15:08:22.683 回答