2011-10-31 18 views
0

所以,我有一個DataTable,看起來像這樣:如何通過AJAX傳遞一個迭代參數到後臺bean的方法

   <h:form> 
     <h:dataTable value="#{backingBean.employeeLineItems}" var="emp"> 
      <h:column> 
       <f:facet name="header">First</f:facet> 
       #{emp.lastname} 
      </h:column> 
      <h:column>    
       <f:facet name="header">Last</f:facet> 
       #{emp.firstname} 
      </h:column> 
      <h:column> 
       <f:facet name="header">Actions</f:facet> 
       <h:commandButton value="View Details"> 
        <f:ajax execute="#{setCurrentEmployeeId(emp.id)}" render="employeeDetails"/> 
       </h:commandButton> 
      </h:column> 
     </h:dataTable> 
        <h:outputText value="#{backingBean.employeeDetails}" id="employeeDetails"/> 
       </h:form> 

對於數據表的每一行,有一個按鈕,我想,當點擊時,ajax將employeeLineItem的id值轉換爲在backing bean中設置該id的方法,然後呈現標識爲「employeeDetails」的outputText標記(getEmployeeDetails方法將使用employeeLineItem標識從數據庫,當然)

我的解決方案似乎並沒有工作,有誰知道我在做什麼錯了?

回答

2
<h:commandButton value="View Details"> 
    <f:ajax execute="#{setCurrentEmployeeId(emp.id)}" render="employeeDetails"/> 
</h:commandButton> 

這是不對的。 <f:ajax>execute屬性應該指向要在服務器端提交和處理的空間分離的組件客戶端ID集合(與指定render屬性的方式相同,即使用空間分隔的要組合的客戶端ID集合在ajax請求之後更新/重新呈現)。在你的特定情況下,它應該是數據表或表單的ID,或者只是一般地引用父表單。

其中您傳遞行ID的操作方法應該在<h:commandButton>action屬性中定義。所以,這應該這樣做:

<h:commandButton value="View Details" action="#{backingBean.setCurrentEmployeeId(emp.id)}"> 
    <f:ajax execute="@form" render="employeeDetails"/> 
</h:commandButton> 

(注意,我固定在操作方法缺少管理bean的名字)

順便說一句,你知道,你也可以只通過整個對象一起作爲EL中的參數?

<h:commandButton value="View Details" action="#{backingBean.setCurrentEmployee(emp)}"> 
    <f:ajax execute="@form" render="employeeDetails"/> 
</h:commandButton> 

這樣您就不需要從數據庫重新加載員工。

+0

謝謝,我修復了我的代碼以使用您的方法。但是,使用會導致錯誤「包含未知ID'employeeDetails' - 無法在組件j_idt21的上下文中找到它」。看起來outputText標記無法解析,即使我是通過id引用它的,它的形式相同? – bitsmcgee77

+0

''也是'NamingContainer'組件。你需要指定絕對ID(給你的''一個ID並使用'render =「:formId:employeeDetails」')或者將輸出組件綁定到視圖並使用'render =「:#{outputComponent。 clientId}「'。 – BalusC

+0

非常感謝你,這個伎倆。 – bitsmcgee77

相關問題