从外部对话框更新 rowExpansion Primefaces 内的行子数据表而不关闭它

Update from an external dialog a row child dataTable inside a rowExpansion Primefaces without closing it

从外部对话框保存后,我试图从 rowExpansion 更新一行而不更新整个表单以不关闭。 我只想更新我刚刚从 rowExpansion 的 dataTable 编辑的子行。

idCommandButtonDetailProductChild 按钮调用 idDialogDetailProduct 对话框,可以在其中编辑数据。在这个对话框中,当使用 idCommandButtonUpdate 按钮保存时,我希望 idTableDetailProductChild 的行在不关闭 rowExpansion 的情况下更新。

我的代码如下:

ProductsList.xhtml(带行扩展的数据表)

        <!-- PRODUCT LIST -->
        <p:dataTable id="idTableDetailProduct"                      
                     paginator="false" 
                     value="#{productController.productDetailDTOs}"
                     var="productDetail"
                     selection="#{productController.selectedProductDTOs}"
                     rowKey="#{productDetail.id}"
                     emptyMessage="#{diccBean.msg['product.productNotFound']]}"
                     scrollable="true"
                     scrollHeight="600">                     
                     ...
                                                                    
                <p:rowExpansion>
             
                <!-- PRODUCT LIST CHILD -->
                <p:dataTable id="idTableDetailProductChild" 
                            paginator="false" 
                            value="#{productDetail.productDTO.listProductsChild}"
                            var="productChild"
                            rowKey="#{productDetail.id}"                                     
                            emptyMessage="#{diccBean.msg['product.productChildNotFound']}"
                            scrollable="true">  
                            
                            
                            <!-- VIEW PRODUCT DETAIL  -->
                            <p:commandButton 
                                id="idCommandButtonDetailProductChild" 
                                title="#{diccBean.msg['product.detailProduct']}"
                                icon="fa fa-fw fa-search"
                                action="#{productController.initDetailProduct}"
                                oncomplete="PF('widgetVarDetailProduct').show();"
                                update="tabViewDetalle:idDialogDetailProduct">
                                <f:setPropertyActionListener value="#{productChild.productDetailDTO.id}" target="#{productController.productDetailId}"/>                                                                
                            </p:commandButton>  

                    
    
                            

ProductDialog.xhtml(我从那里更新 rowExpansion 的子行)

<h:body>
        <ui:composition>    
            <p:dialog id="idDialogDetailProduct"            
                header="#{diccBean.msg['product.tittleDetailProduct']]}"
                resizable="false" 
                widgetVar="widgetVarDetailProduct" 
                modal="true"
                width="1200"            
                appendTo="@(body)"
                binding="#{productController.idDialogDetailProduct}">
                
                <h:form id="formDetailProduct">
                
                ...

                        <!-- SAVE COMPONENT BUTTON  -->
                        <p:commandButton 
                            id="idCommandButtonUpdate"                         
                            value="Componente: #{diccBean.msg['actions.save']}"
                            action="#{productController.actionUpdate}"
                            process="@form"
                            icon="fa fa-fw fa-check" 
                            update="tabViewDetalle:idTableDetailProduct" /> 


                </h:form>                           
            </p:dialog>         
        </ui:composition>
    </h:body>

通过将父行的索引放在更新属性中,您可以只更新 rowExpansion(子数据表)的一行而不关闭它。

例如,如果父行是第 3 项,则如下所示:

update=":tabViewDetail:idTableDetailProduct:3:idTableDetailProductChild"

要动态地做到这一点,我们可以通过将父元素的索引传递给它来做到这一点:

update=":tabViewDetail:idTableDetailProduct:#{productController.indexParent}:idTableDetailProductChild"

并且父行的索引可以通过在父数据表中添加以下属性来获取:

rowIndexVar="indexParent"

然后我们将它设置为这样的 bean:

<f:setPropertyActionListener value="#{indexParent}" target="#{productController.indexParent}" />

那么解决方案如下:

ProductsList.xhtml

            <!-- PRODUCT LIST -->
            <p:dataTable id="idTableDetailProduct"  
                         value="#{productController.productDetailDTOs}"
                         var="productDetail"            
                         ...
                         rowIndexVar="indexParent">
 
 
                <p:rowExpansion>
                 
                    <!-- PRODUCT LIST CHILD -->
                    <p:dataTable id="idTableDetailProductChild"                                 
                                value="#{productDetail.productDTO.listProductsChild}"
                                var="productChild"  
                                ...>                                
                                
                                <!-- VIEW PRODUCT DETAIL  -->
                                <p:commandButton 
                                    id="idCommandButtonDetailProductChild"
                                    ...>                                    
                                    <f:setPropertyActionListener value="#{indexParent}" target="#{productController.indexParent}" />                                                                            
                                </p:commandButton>
    
    

productController Bean (Java)

@ManagedBean(name="productController")      
        public class ProductController{
        
            int indexParent;
        
            public int getIndexParent() {
                return indexParent;
            }

            public void setIndexParent(int indexParent) {
                this.indexParent = indexParent;
            }
 
        }
    
    

ProductDialog.xhtml

<h:body>
    <ui:composition>    
        <p:dialog id="idDialogDetailProduct"            
                ...>                            

            <!-- SAVE COMPONENT BUTTON  -->
            <p:commandButton 
                id="idCommandButtonUpdate"                         
                ... 
                update=":tabViewDetail:idTableDetailProduct:#{productController.indexParent}:idTableDetailProductChild" />  
                                
        </p:dialog>         
    </ui:composition>
</h:body>