2011-07-20 26 views
0

Hy我在做什么来创建一个自动完成输入文本,但是当表单提交时我想设置一个id或一个employee对象,而不是获取从输入field.can有人串帮助..how我可以使用hiddeninput场或使用Javascript/AJAX功能做that.THX ..JSF Richfaces自动完成问题 - 发送隐藏参数using..anything

<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> 

我真的愿意接受任何建议。

+0

这是一个很大的问题,甚至RichFaces的附加功能如何完全不成熟的JSF和是很好的例子。他们在RF 4.x中推荐使用rich:suggestionBox(大概是因为它有缺陷),而替换是丰富的:自动完成。但是,这只能返回一个不可能绑定的字符串,并选择一个OBJECT(域模型等)。 –

回答

1

我有同样的情况。我制定的最终答案是使用jsFunction,并结合后台bean中的操作方法。

首先,ID值将在短时间内被提取到自动填充字段中。调用onselectitem JS函数。 jsFunction的execute属性确保在我的populateEmployee动作被调用之前,获取的ID值被绑定到backing bean字段中。 populateEmployee转身,将字段中的ID值移动到我想要的位置,然后用我最终想要显示的任何内容(在本例中为名称)替换自动填充字段的值。然后名称自动填充字段被重新渲染。

根据您的后端系统与员工ID到名称查找的速度有多快,基本标识将在短时间内显示,而您的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}"/> 

辅助Bean:

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; 
    } 
    } 
} 
+0

Thx.Does适合你吗? – Alexx

+0

不幸的是没有。有两个问题 - 我忘记了组件的ID属性不能是EL表达式。而onselectitem中的JS函数无法访问选定的自动填充条目 - 它按原样输出到客户端HTML。我会用我更复杂的工作例子在一段时间内提出一个精致的答案。 –

+0

非常感谢作者,但这只突出了JSF的不成熟,甚至是它们的展示扩展RichFaces。这种解决方法带来了不必要的副作用(因为这个用例并不是真正的自动完成'字段',而是一个带有动态结果集和对象选择功能的自动完成)非常复杂,引入了JS,JSF支持者不希望开发人员与使用“库存”组件相加。 –

1

您可以在JS函数中使用a4j:param和param值赋给asignedTo价值。

而且使用事件onselectitem="chooseEmployee(this.value)"丰富:自动完成