如何保持primefaces rowexpansion开放?

时间:2013-12-16 13:53:17

标签: jsf primefaces

到目前为止,我有一个带行扩展的嵌套数据表,所以上帝,但我想保持所有行扩展(打开)如何在primefaces上实现这一点?

提前感谢。

抱歉,我没有告诉我使用的版本是什么版本的3.5版本。

4 个答案:

答案 0 :(得分:13)

根据Primefaces 4.0文档:

  

p:rowToggler 组件放置展开/折叠图标,单击折叠的行加载   用ajax扩展内容。如果您需要在默认情况下将行显示为展开,请使用 expandedRow   在呈现每一行之前评估的属性,因此支持值表达式。

要打开所有行,请在数据表中使用它,如下所示:

<p:dataTable value="#{bean.list}" expandedRow="#{true}">

要在更新前打开已打开的行,您需要:

  • 保持跟踪(服务器端可能最好)手动打开和关闭哪些行(通过ajax执行此操作)
  • 打开(重新)加载p:dataTable您应该在expandedRow属性中放置一个EL来评估它正在处理的当前行(使用var属性或数据表或rowkey上的索引)对于之前展开的每一行都返回true。

像这样的东西(未经过充分测试)

<p:dataTable value="#{bean.list}" var="myRow" expandedRow="#{bean.isExpanded(myRow)}">

以下是Google代码中的the feature request,其目标是3.5.12和4.0。

答案 1 :(得分:2)

另一种解决方案可能是:

<p:commandButton type="button" onclick="jQuery('.ui-row-toggler').click()" value="Expand/Collapse All" />

答案 2 :(得分:0)

如果您想在开始时折叠您的行:

<p:headerRow>
  <p:column styleClass="my-class">
    <h:outputText value="#{bean.value}"/>
  </p:column>
</p:headerRow>

...

<script>
  $(document).ready(function () {
    $('td.my-class > .ui-rowgroup-toggler').click();
  });
</script>

答案 3 :(得分:0)

如果只更新行子级而不更新所有表单或数据表,您可以保持打开 rowExpansion。

例如,如果父行是第 3 项:

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

Y para hacerlo de forma dinámica podríamos hacerlo pasándole el índice del elemento padre:

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>

这个例子是我从对this post的回答中得到的