【问题标题】:How to pass an iterated parameter via ajax to a backing bean method如何通过 ajax 将迭代参数传递给支持 bean 方法
【发布时间】:2011-10-31 15:51:45
【问题描述】:

所以,我有一个如下所示的数据表:

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

对于数据表的每一行,都有一个按钮,当单击该按钮时,将employeeLineItem id 值ajax 到在支持bean 中设置该id 的方法,然后呈现带有id“employeeDetails”的outputText 标签"(当然,getEmployeeDetails 方法会使用employeeLineItem id 从数据库中获取正确的员工详细信息对象)

我的解决方案似乎不起作用,有人知道我做错了什么吗?

【问题讨论】:

    标签: ajax jsf datatable


    【解决方案1】:
    <h:commandButton value="View Details"> 
       <f:ajax execute="#{setCurrentEmployeeId(emp.id)}" render="employeeDetails"/> 
    </h:commandButton>
    

    这是错误的。 &lt;f:ajax&gt;execute 属性应指向将在服务器端提交和处理的组件客户端 ID 的空格分隔集合(与使用空格分隔的组件集合指定 render 属性相同的方式在 ajax 请求之后要更新/重新呈现的客户端 ID)。在您的特定情况下,它应该是数据表或表单的 ID,或者只是 @form 来泛指父表单。

    应该在&lt;h:commandButton&gt;action 属性中定义传递行ID 的操作方法。所以,应该这样做:

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

    (请注意,我修复了 action 方法中缺少的托管 bean 名称)

    顺便说一句,你知道你也可以在 EL 中将整个对象作为参数传递吗?

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

    这样您就不需要从数据库中重新加载员工。

    【讨论】:

    • 谢谢,我修复了我的代码以使用您的方法。但是,使用 会导致错误 " contains an unknown id 'employeeDetails' - 无法在组件 j_idt21 的上下文中找到它" 。 outputText 标记似乎无法解析,即使我通过 id 引用它,并且它的格式相同??
    • &lt;h:dataTable&gt; 也是一个NamingContainer 组件。您需要指定绝对 ID(给您的 &lt;h:form&gt; 一个 ID 并改用 render=":formId:employeeDetails"。或者将输出组件绑定到视图并使用 render=":#{outputComponent.clientId}"
    • 完成。顺便说一句,知道为什么渲染 outputText 元素的 ajax 调用会坚持尝试在支持 bean 中调用我的数据表集合 getter 吗?我的 getEmployeeDetails 方法完全没有引用它。我曾假设渲染只是对内联的 outputText 方法进行更改,页面上的其他所有内容均不受影响。
    • 在应用请求值阶段调用 getter,因为 JSF 需要识别已按下的命令按钮以执行操作并传递当前迭代的行对象。另见stackoverflow.com/q/2118656stackoverflow.com/q/2090033
    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多