【问题标题】:Pass parameter to f:ajax inside c:foreach loop将参数传递给 c:foreach 循环内的 f:ajax
【发布时间】:2013-02-14 19:29:00
【问题描述】:

我正在尝试将参数传递给 ajax 事件,这是我的意思的一个示例:

<h:panelGrid id="pictures" columns="3">
    <c:forEach items="#{createProduct.pictures}" var="picture">
        <h:graphicImage value="#{picture.source}" />
        <h:inputText value="#{picture.alt}" />
        <p:commandButton value="Remove">
            <f:ajax execute="@form" 
                    listener="#{createProduct.removePicture(picture)}" 
                    render="@form" />
        </p:commandButton>
    </c:forEach>
</h:panelGrid>

我知道这段代码不起作用,因为您无法通过 ajax 侦听器传递参数。虽然这只是我想要完成的一个例子。我曾尝试将&lt;f:param id="picture" value="#{picture}" /&gt; 与 ajax 标记一起使用,但这会导致重复的组件 ID 形式:图片,因为它处于循环中。 我需要在方法中使用此参数以确定要删除的图片。 如何用 ajax 解决这个问题?

我正在使用@ViewScoped CDI-bean。

【问题讨论】:

    标签: jsf primefaces


    【解决方案1】:

    首先,我建议将c:forEach 替换为ui:repeat 标签。其次,当你使用 Primefaces 时,你应该使用它的全部力量。所以,commandButton 可以更容易地写成:

    <p:commandButton value="Remove" process="@form" update="@form" action="#{createProduct.removePicture(picture)}"/>
    

    就是这样。不要复杂。

    顺便提一下,primefaces commandButton默认发送AJAX请求,你不需要(而且你不能使用)f:ajax标签。

    【讨论】:

    • @Partlov。我正在使用c:forEach,因为ui:repeat 不适用于h:panelGrid,因为ui:repeat 是一个渲染时间标签。我将使用p:commandButton 尝试解决方案。 @KarlKildén。它可以与f:ajax 一起使用,但不能与参数一起使用。
    • 出于某种原因,Primefaces ajax 的解决方案只会成功触发一次,之后它就不再执行任何操作。我解释的相关问题:stackoverflow.com/questions/14796984/…
    • 我非常支持 p:commandButton 不能与 f:ajax 一起使用。
    • 好的,我同意您的观点,您提供的解决方案应该是执行此操作的最干净的方式。我之前自己试过,但是它只允许我执行一个 ajax 请求。
    • 在支持 bean 的 @PostConstruct 方法或构造函数中放置断点。我怀疑 bean 是在每个请求(以及 AJAX 请求)中创建的
    猜你喜欢
    • 2013-12-14
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 2019-06-28
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多