JSF <f:ajax> 标签在提交后不呈现我的表单

JSF <f:ajax> tag not rendering my form after submitting

我正在尝试在调用删除其中一个元素的托管 Bean 操作后呈现我的元素列表。 这是我的 jsf 页面代码:

<div class="container">
    <div class="starter-template">
        <h:form id="productslist">
            <div class="row">
                <ui:repeat value="#{listProductsManagedBean.products}" var="product">
                    <div class="col-md-4">
                        <h1>
                            <h:outputText id="outputname" value="#{product.name}"/>
                        </h1>
                        <p>
                            <h:outputText id="outputprice" value="#{product.price} #{product.currency}"/>
                        </p>
                        <p>
                            <h:commandLink class="btn btn-primary btn-lg" value="Delete" action="#{listProductsManagedBean.delete}">
                                <f:ajax render="outputprice outputname"/>
                                <f:param name="id" value="#{product.id}" />
                            </h:commandLink>
                        </p>
                    </div>
                </ui:repeat>
            </div>
        </h:form>
    </div>
</div>

这是我正在调用的托管 bean 操作:

public void delete(){
   ProductEntity product;
   product = productEntityFacade.find(id);
   productEntityFacade.remove(product);
}

我希望呈现我的表单并且不再显示已删除的元素。

您无法通过这种方式从 ui:repeat 中删除已删除的元素。请尝试 render="@form".

此外,在 f:ajax 中使用 execute="@this" 是更好的做法。您无需提交整个表单即可进行删除操作。

<h:commandLink class="btn btn-primary btn-lg" value="Delete" action="#{listProductsManagedBean.delete}">
    <f:ajax execute="@this" render="@form"/>
    <f:param name="id" value="#{product.id}" />
</h:commandLink>

已解决。我犯了一个愚蠢的错误。我没有在托管 Bean 中重新加载列表(在 @PostConstruct 方法中填充),现在正在使用 t:dataList 标记。