Проблема автозаполнения JSF Richfaces - отправить скрытый параметр, используя ... все - PullRequest
0 голосов
/ 20 июля 2011

Hy То, что я пытаюсь сделать si, чтобы создать автозаполнение входного текста, но когда форма отправлена, я хочу установить идентификатор или объект сотрудника, а не получить строку из поля ввода. Может кто-то помочь .. как я могу использовать поле hiddeninput или функцию javascript / ajax, чтобы сделать это. THX ..

<rich:autocomplete  mode="cachedAjax" tokens="," minChars="0"
            autoFill="true" selectFirst="true"
            autocompleteMethod="#{employeeBean.employeeSuggestions}" var="employee"
            fetchValue="#{employee.firstName} #{employee.lastName}">
             <h:inputHidden id="employeeId" value="#{employee.id}"/>
            <h:column >
                <h:outputText value="#{employee.firstName}" />
                <h:outputText value="&#160;" />
            </h:column>
            <h:column>
                <h:outputText value="#{employee.lastName}" />
            </h:column>
        </rich:autocomplete>
    </h:panelGrid>

    <h:panelGrid columns="3" cellspacing="5">
        <h:commandButton value="#{messages.ok}"
            action="#{departmentBean.addOrUpdateDepartment}">
        </h:commandButton>
        <h:commandButton action="department" value="#{messages.close}"
            immediate="true" />
    </h:panelGrid>

Я открыт для любых предложений.

Ответы [ 2 ]

1 голос
/ 26 июля 2012

Вы можете использовать a4j:param в функции JS и назначить значение параметра asignedTo Value.

И использовать событие onselectitem="chooseEmployee(this.value)" в rich: autocomplete

1 голос
/ 25 августа 2011

У меня такая же ситуация. В конечном итоге я решил использовать jsFunction в сочетании с методом действия в компоненте поддержки.

Во-первых, значение ID будет загружено в поле автозаполнения на короткое время. JS-функция onselectitem называется. Атрибут execute функции jsFunction гарантирует, что извлеченное значение идентификатора будет привязано к полю вспомогательного компонента перед вызовом моего действия populateEmployee. populateEmployee оборачивается, перемещает значение идентификатора в поле туда, куда я хочу, и заменяет значение поля автозаполнения тем, что я в конечном итоге хочу отображать (в данном случае, именем). Затем поле автозаполнения имени будет перерисовано.

В зависимости от того, насколько быстро ваша бэкэнд-система справляется с поиском идентификатора сотрудника, базовый идентификатор будет отображаться на короткое время, пока выполняется ваш эквивалент populateEmployee. Но это настолько близко, насколько я могу найти приемлемое (в моем случае) рабочее решение.

JSF:

<a4j:jsFunction name="chooseEmployee" execute="employeeSearchName" action="#{employeeSearchBean.populateEmployee}" render="selectedEmployeeId employeeSearchName"/>
<rich:autocomplete id="employeeSearchName" mode="ajax" minChars="3"
                   autocompleteMethod="#{employeeSearchBean.searchEmployees}" var="emp"
                   autofill="false" layout="table"
                   fetchValue="#{emp.employee.id}" value="#{employeeSearchBean.selectedEmployeeName}"
                   onselectitem="chooseEmployee()">
... output columns ...
</rich:autocomplete>
<h:outputText id="selectedEmployeeId" value="#{employeeSearchBean.selectedEmployeeId}"/>

Фасоль:

private String selectedEmployeeName;
private Integer selectedEmployeeId;

public void populateEmployee() {
  selectedEmployeeId = Integer.parseInt(selectedEmployeeName);
  for (EmployeeSearchEntry entry : data) {
    if (entry.getEmployee().getId().equals(selectedEmployeeId)) {
      selectedEmployeeName = entry.getNameLfm();
      break;
    }
  }
}
...