2011-07-20 28 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)"豐富:自動完成