gpt4 book ai didi

java - 具有不同类型列的 JSF 惰性数据表

转载 作者:行者123 更新时间:2023-11-30 09:19:11 26 4
gpt4 key购买 nike

我正在使用 Primefaces 3.5 中的 p:dataTable 以及延迟加载和动态列。

我有三种类型的列,区别在于过滤的输入。一个有 p:inputText,一个有 p:selectCheckboxMenu,最后一个什么都没有。

列通过 c:foreach 标签呈现。

<c:forEach var="col" items="#{cc.attrs.bean.sortedModelColumns}">

一切正常,但不是“懒惰”。我还有 p:tabView,其中每个选项卡都包含此数据表,并且对于每个请求,所有 bean 都已初始化。我知道,c:forEach 正在构建时进行评估,因此它在 tabView 之前。

因此,我的问题是:如何在 p:dataTable 中呈现不同的列?

我试过 ui:repeat 如下:

<p:dataTable 'datatableDefinition' />
<ui:repeat var="#col" value="#{cc.attrs.bean.sortedModelColumns}">
columnsRendering
</ui:repeat>
</p:dataTable>

但这将是一个空的数据表。当我将 ui:repeat 放在 p:dataTable 之外时,它起作用了。

我也试过 p:columns 它渲染一切都很好,但是用于过滤 p:inputText

的监听器
<p:ajax event="keyup" listener="#{cc.attrs.bean.filterListener}" />

不工作。

我想,我有两个选择。首先:使 p:columns 以某种方式工作或尝试在 p:tabView 中使用 c:if,但我不知道如何触发评估 中的测试c:if 选项卡切换事件。

无论如何,我很乐意提供任何帮助。

编辑:数据表的完整代码

<p:dataTable widgetVar="entityTable" var="entity" value="#  {cc.attrs.bean.loadEntities(cc.attrs.groupId)}" 
resizableColumns="true" lazy="true"
rowStyleClass="#{entity.updated ? 'updatedRow' : ''}"
paginator="true" rows="10"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,20" paginatorPosition="bottom"
scrollable="true" scrollWidth="#{userSessionBean.windowWidth -35}">
<p:ajax event="colReorder" listener="#{cc.attrs.bean.onReorder}" />
<p:ajax event="sort" listener="#{cc.attrs.bean.sortListener}" />
<p:column style="width:20px" >
<f:facet name="header">
<p:selectBooleanCheckbox value="#{cc.attrs.bean.checkbox}">
<p:ajax onstart="return selectAll('#{component.clientId}');"/>
</p:selectBooleanCheckbox>
</f:facet>-->
<p:selectBooleanCheckbox value="#{cc.attrs.bean.checkbox}" styleClass="entitySelectCheckbox">
<p:ajax listener="#{cc.attrs.bean.onEntitySelected(entity.id)}"/>
</p:selectBooleanCheckbox>
<p:commandLink id="notifIcon" styleClass=" #{entity.notification?'notification':''}" />
</p:column>
<p:column style="width:13px" rendered="#{not empty cc.attrs.subview}">
<p:commandLink process="@this" value="&nbsp;&nbsp;&nbsp;" id="loadEntity" styleClass="loadEntity"
immediate="true" onstart="hideRows('#{component.clientId}');" actionListener="#{cc.attrs.bean.setSelectedRowId(component.clientId)}" action="#{cc.attrs.bean.selectEntity(entity.id)}"
update="@(##{pe:escapeSelector(cc.clientId)}\\\\:entityTableForm)"/>
</p:column>
<p:columns var="col" value="#{cc.attrs.bean.sortedModelColumns}">
<f:attribute name="property" value="#{col.property}" />
<f:facet name="header">
<div style="width: #{col.width}">
#{col.header}
</div>
<p:outputPanel rendered="#{not cc.attrs.bean.isColDate(col.property)}" >
<p:inputText id="#{col.property}Id" styleClass="filterInput" rendered="#{not cc.attrs.bean.isColEnum(col.property) and not cc.attrs.bean.isColVisual(col.property)}" size="10" onkeyup="delay(function(){entityTable.filter();console.log('x');}, 500 );" >
<p:ajax event="keyup" listener="#{cc.attrs.bean.filterListener}" />
<f:attribute name="property" value="#{col.property}" />
<f:attribute name="operator" value="#{col.operator}" />
<f:event id="filterEvent" type="javax.faces.event.PreRenderComponentEvent" listener="#{cc.attrs.bean.filterRendered}"/>
</p:inputText>

<p:selectCheckboxMenu rendered="#{cc.attrs.bean.isColEnum(col.property)}" label="Choose" styleClass="filterInput">
<f:attribute name="property" value="#{col.property}" />
<f:selectItems value="#{cc.attrs.bean.getEnumStrings(col.property)}" var="item" />
<p:ajax event="change" listener="#{cc.attrs.bean.onEnumFilterChange}" oncomplete="setTimeout('entityTable.filter()',200);"/>
</p:selectCheckboxMenu>
</p:outputPanel>
<p:outputPanel rendered="#{cc.attrs.bean.isColDate(col.property)}" >
<p:calendar pattern="#{userSessionBean.person.settings.timeFormat}" styleClass="filterInput filterInputDate">
<f:attribute name="property" value="#{col.property}" />
<f:attribute name="operator" value=">=" />
<p:ajax event="dateSelect" listener="#{cc.attrs.bean.onDateFilterChange}" oncomplete="setTimeout('entityTable.filter()',200);" />
</p:calendar>
<p:calendar pattern="#{userSessionBean.person.settings.timeFormat}" styleClass="filterInput filterInputDate">
<f:attribute name="property" value="#{col.property}" />
<f:attribute name="operator" value="&lt;=" />
<p:ajax event="dateSelect" listener="#{cc.attrs.bean.onDateFilterChange}" oncomplete="setTimeout('entityTable.filter()',200);" />
</p:calendar>
</p:outputPanel>
</f:facet>
<p:outputPanel rendered="#{not cc.attrs.bean.isColDate(col.property)}">
<p:outputPanel rendered="#{not cc.attrs.bean.isColVisual(col.property)}">
<h:outputText rendered="#{empty col.chainedProperty}"
value="#{entity[col.property]}" />
<h:outputText rendered="#{not empty col.chainedProperty}"
value="#{entity[col.primaryProperty][col.chainedProperty]}" />
<h:outputText rendered="#{not empty col.middleProperty}"
value="#{entity[col.primaryProperty][col.middleProperty][col.chainedProperty]}" />
</p:outputPanel>
</p:outputPanel>
<kwe:inlineprogress status="#{entity.status}" rendered="#{cc.attrs.bean.isColVisual(col.property)}" />
<h:outputText rendered="#{cc.attrs.bean.isColDate(col.property)}" value="#{cc.attrs.bean.dateTimeDisplay(entity[col.property])}"/>
</p:columns>
<f:event id="event2" type="javax.faces.event.PreRenderComponentEvent" listener="#{cc.attrs.bean.allRendered}"/>
</p:dataTable>

最佳答案

您不能在 p:dataTable 中使用 ui:repeatc:forEach,但我认为您可以使用 p:columns

关于java - 具有不同类型列的 JSF 惰性数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18089238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com