Старый вопрос, но я думаю, что он стоит другого взгляда.
Проблема с minQueryLenth = 0 или minQueryLenth = 1 заключается в том, что он может возвращать сотни вариантов (и, конечно, пользователь не будет читать все из них, чтобы выбрать один). Мое решение было следующим.
Прежде всего мне нужно, чтобы входные данные были отправлены на сервер, как только пользователь выберет одно из его значений (в моем случае использования пользователю не разрешено переходить к следующему шагу в мастере, если это значение равно нулю или пусто). Поэтому я поставил функцию ajax, срабатывающую в случае выбранного значения.
XHTML:
<p:autoComplete
id="someId"
value="#{myViewScopedBean.selectedValue}"
...
...
minQueryLenth="5"
onblur="autoCompleteLostFocus('someId', 'someCommand()')">
<p:ajax
event="itemSelect"
listener="#{myViewScopedBean.newValueSelected}"
process="@this"
update="commandButtonGoToNextStep" />
</p:autoComplete>
<p:remoteCommand
name="someCommand"
actionListener="#{myViewScopedBean.setValueNull}"
update="commandButtonGoToNextStep" />
<p:commandButton
id="commandButtonGoToNextStep"
...
...
disabled="#{myViewScopedBean.selectedValue == null}" />
Если пользователь очищает текст, мне нужно отправить это значение в «myViewScopedBean» и обновить компонент, который позволяет пользователю перейти к следующему шагу. Я решил, что поместив функцию JavaScript, которая вызывается, когда автозаполнение теряет фокус.
JavaScript:
function autoCompleteLostFocus(autocompleteId, comand) {
if ($("[id='" + autocompleteId + "_input']").val().trim() == "") {
eval(comando);
}
}
в myViewScopedBean:
public void setValueNull() {
selectedValue = null;
}
Надеюсь, это поможет. Много работы, но поведение именно то, что я хотел. Причина использования функции javascript заключается в том, что она просто отправляет информацию сервлету, если значение равно «», в противном случае она ничего не делает.