我有点问题。我想创建一个自定义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类中的方法,但不会呈现该表。它没有显示任何内容:|
你知道为什么吗?我做错了吗?
另外,如果您对此任务有其他想法,欢迎您。 谢谢。
答案 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你在哪里做了解释。谢谢。