Primefaces自定义DataTable未呈现

时间:2015-02-10 07:37:38

标签: jsf jsf-2 primefaces datatable

我有点问题。我想创建一个自定义DataTable来做一个可重用的组件,因为我有很多页面,其中一些包含具有相同结构的表,但有些表包含一些额外的项目。

让我举个例子。

这是常见的表格格式

<p:dataTable id="myTableId"
        widgetVar="wMyTableId"
        scrollable="true" 
        scrollHeight="100%"
        paginator="true"
        paginatorPosition="bottom"
        paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
        currentPageReportTemplate="({startRecord} - {endRecord} of {totalRecords},  page {currentPage}/{totalPages})"  
        rowsPerPageTemplate="20,50,100,200,500"
        rows="20"
        lazy="true"
        value="myBean.dataModel"
        var="item">

        <p:columns value="#{myBean.dataModel.columns}" var="column" columnIndexVar="colIndex">
            <f:facet name="header">
                <h:outputText value="#{column.header}" />
            </f:facet>
            <myComponents:myCell type="#{item.data[column.property].type}" value="#{item.data[column.property].data}"/>
        </p:columns>


        <f:facet name="footer">
            <h:panelGroup layout="block">
                <div class="buttons">
                    <p:commandButton process="@none" update=":myTableId" icon="fa fa-refresh" styleClass="ui-priority-secondary" type="button" value="Refresh" onclick="callARemoteCommand(); return false;"/>
                </div>
             </h:panelGroup>
        </f:facet>
    </p:dataTable>

myBean.dataModel 是从org.primefaces.model.LazyDataModel扩展而来的。 我保证你的工作非常好。

现在,这是最常用的模板,我想将其提取到自定义组件中。 首先,我尝试创建一个扩展javax.faces.component.UiComponentBase的自定义组件,但是当我在其中放入一个 p:ajax 标记时(为了将其分配给我的表),它会崩溃在渲染上,因为它不支持这种标记(很明显)。

好的,我尝试了另一种方式,我做了一个自定义组件,它直接扩展了org.primefaces.component.datatable.DataTable组件。

我创建了java类:

@FacesComponent(tagName = "myTable", value = "myTable")
public class MyTable extends DataTable implements NamingContainer{
    //...nothing fancy here, because it extends directly the DataTable
   @Override
   public void encodeBegin(FacesContext context) throws IOException {
       super.encodeBegin(context);//here debug stops. It's ok
   }
}

...和xhtml文件,暂时不包含模板,我只想打印一个表

<cc:interface componentType="myTable">
</cc:interface>

<cc:implementation>
</cc:implementation>

...在我的页面xhtml文件中我把它:

<myComponents:myTable id="myTableId"
    widgetVar="wMyTableId"
    scrollable="true" 
    scrollHeight="100%"
    paginator="true"
    paginatorPosition="bottom"
    paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
    currentPageReportTemplate="({startRecord} - {endRecord} of {totalRecords},  page {currentPage}/{totalPages})"  
    rowsPerPageTemplate="20,50,100,200,500"
    rows="20"
    lazy="true"
    value="myBean.dataModel"
    var="item">

    <p:ajax event="page" onstart="doPotatos();" oncomplete="eatPotatos();" />
    <p:columns value="#{myBean.dataModel.columns}" var="column" columnIndexVar="colIndex">
        <f:facet name="header">
             <h:outputText value="#{column.header}" />
        </f:facet>
        <myComponents:myCell type="#{item.data[column.property].type}" value="#{item.data[column.property].data}"/>
    </p:columns>
</myComponents:myTable> 

现在,在呈现页面时,将调用MyTable类中的方法,但不会呈现该表。它没有显示任何内容:|

你知道为什么吗?我做错了吗?

另外,如果您对此任务有其他想法,欢迎您。 谢谢。

1 个答案:

答案 0 :(得分:1)

确定,

同时我发现了这个问题。这意味着我不太清楚Primefaces是如何工作的。

在java类中我不应该出现问题。 由于该类实现了NamingContainer,因此该族必须是NamingContainer的特定系列。所以,该课程现在如下:

@FacesComponent(value = "myTable")
public class MyTable extends DataTable implements NamingContainer{
    //actually this is some fancy thing :|
    @Override
    public String getFamily() {
        return UINamingContainer.COMPONENT_FAMILY;//javax.faces.NamingContainer
    }
}
奥奇,花了我一些时间才弄明白。现在渲染了xhtml合成,但我也希望渲染DataTable(扩展),但事实并非如此。也许有人知道为什么不渲染。

@BalusC - 我看到你是一个Primefaces的禅宗。你知道为什么会这样吗?

EDITED


搜索其他任何内容,我发现这篇文章https://stackoverflow.com/a/12531268/1589496你在哪里做了解释。谢谢。