2011-10-31 46 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