Сбросить значение null в событии автозаполнения простых лиц - PullRequest
5 голосов
/ 26 марта 2012

У меня есть событие автозаполнения, которое срабатывает правильно после выбора значения. Я хочу, чтобы другое событие сработало после того, как я удалю значение в текстовом поле и верну нулевое значение. Я думал об использовании атрибута onChange, но у меня были проблемы, поэтому я вернулся к исходному коду.

<p:autoComplete id="deviceAuto" dropdown="true" scrollHeight="250" 
                value="#{summaryReportController.device.nickname}" 
                forceSelection="true" 
                completeMethod="#{summaryReportController.deviceComplete}">
    <p:ajax event="itemSelect" 
        listener="#{summaryReportController.handleDeviceSelect}" 
        update="printThis" />  
</p:autoComplete> 
public void handleDeviceSelect(SelectEvent event) {
    String deviceSelect = event.getComponent().getId();
    if (deviceSelect.equalsIgnoreCase("deviceAuto")) {
        Device selectedDevice = deviceMgr.getDevicebyNickname(device.getNickname());
        setDevice(selectedDevice);
    }
    updateInterface();
}

Ответы [ 4 ]

4 голосов
/ 25 июня 2012

Атрибут autoComplete minQueryLength по умолчанию равен 1, и ваша строка поиска будет обновляться при удалении до длины 1 символа.

Например: вы вводите 'foo' - и эта строка предоставляетсяметод поиска (обновление после ввода первого символа - minQueryLength = 1)

Но когда вы удаляете строку поиска - она ​​также обновляется до длины 1.

Решение: установить атрибут minQueryLength="0"

Или:

, если вам нужно большее значение, добавьте к своему autoCompleteMethod(String search) условию:

if (search.length()<={your minQueryLength attribute} )   field = null;
4 голосов
/ 27 марта 2012

Когда вы изменяете текстовое содержимое текстового поля автозаполнения, метод поиска (aka. CompleteMethod) будет вызываться на компоненте поддержки. Вы можете сбросить значение на null, если получите пустую строку.

Фасоль

// insert getter and setter for the device property ...

/** Search for devices by name */
public List<String> deviceComplete(String search) {
    if (StringUtils.isBlank(search)) {
        setDevice(null);  // textfield was cleared, reset device value!
        return Collections.emptyList();
    } else {
        // search for devices ...
        return deviceNames;
    }
}

Обратите внимание, что я использовал Apache Commons StringUtils.isBlank (String) , чтобы проверить, была ли строка нулевой или содержала только пробельные символы.

JSF View

В своем файле XHTML вы, вероятно, захотите прослушать любое событие Ajax для обновления своего представления - или вы сами выясните, какое событие вам нужно (размытие, изменение, что угодно):

<p:autoComplete ...>
    <p:ajax event="itemSelect" listener="..." update="..." />
    <p:ajax process="@this" update="..." />
</p:autocomplete>

Надеюсь, это поможет.


Альтернатива может быть чем-то вроде кнопки «очистить» или «сбросить» рядом с текстовым полем поиска, чтобы дать понять пользователю, что значение будет очищено.

1 голос
/ 17 ноября 2015

Старый вопрос, но я думаю, что он стоит другого взгляда.

Проблема с 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 заключается в том, что она просто отправляет информацию сервлету, если значение равно «», в противном случае она ничего не делает.

0 голосов
/ 09 апреля 2019

Под совершенно другим углом ...

Почему у вас есть summaryReportController.device.nickname в качестве значения в автозаполнении?

Я бы посоветовал вам использовать устройство в качестве значения и указать

  • вар
  • itemLabel
  • ItemValue
  • Преобразователь

в вашем автозаполнении, в то время как ваш completeMethod вернет список устройств, отфильтрованных по нику. Конвертер является реализацией javax.faces.convert.Converter.

См. Чехол для POJO в PF Showcase .

...