我有一个tabView,其中包含动态数量的标签,用于显示搜索结果(在SearchInstance类中)。在选项卡内部还有一个tabView,它以不同的方式显示搜索结果。此内部tabView的一个选项卡显示dataTable(作为List)中的搜索结果。行是可选择的。我将表中选定的搜索结果传播到当前的SearchInstance对象。 遗憾的是,所选搜索结果仅在最后一个选项卡上正确设置。如果我在最后一个选项卡之前的选项卡上选择搜索结果,则ajax请求不会触及正确的SearchInstance实例,并且即使选择了某些行也会传播空List。
一些缩短的代码:
外部tabView:
<p:tabView id="searchTabViewId" activeIndex="#{searchBL.activeTabIndex}">
<p:ajax event="tabClose" listener="#{searchBL.onCloseTab}" />
<c:forEach items="#{searchBL.searchInstances}" var="curSearch">
<p:tab closable="#{curSearch.isCloseable()}">
<ui:include
src="#{curSearch.closeable ? '/sections/search/searchInstanceTab.xhtml' : '/sections/search/firstSearchTab.xhtml'}">
<ui:param name="curSearch" value="#{curSearch}" />
</ui:include>
</p:tab>
</c:forEach>
索引0上的选项卡具有特殊含义作为搜索模板,不可关闭。因此第一个选项卡始终相同,但也有一个SearchInstance作为模型。在第一个选项卡上没有显示dataTable。因此,问题出现在索引&gt;的选项卡上0
searchInstanceTab.xhtml:
<h:form rendered="#{curSearch.isCloseable()}">
<h:panelGrid id="searchMaskInstanceOuterGridId" columns="1">
<p:tabView id="listResultTabViewId">
<p:tab id="listResultTabId">
<ui:include src="/sections/search/resultList.xhtml">
<ui:param name="curSearch" value="#{curSearch}" />
</ui:include>
</p:tab>
...
</p:tabView>
</h:panelGrid>
dataTable位于resultList.xhtml
中<p:dataTable id="searchResultTableId" scrollable="true" value="#{curSearch.getSearchResults()}" scrollHeight="300"
var="curSearchResult" sortMode="multiple" rowKey="#{curSearchResult.hashCode()}" draggableColumns="true"
resizableColumns="true" selection="#{curSearch.selectedSearchResults}" >
<p:ajax event="rowSelect" />
<p:ajax event="rowUnselect" />
<p:ajax event="toggleSelect" />
<p:ajax event="rowSelectCheckbox" />
<p:ajax event="rowUnselectCheckbox" />
<p:column style="width: 16px;">
<p:rowToggler />
</p:column>
<p:column selectionMode="multiple" style="width: 16px; text-align:center" />
<p:columns value="#{curSearch.determinePrimaryPropertyNames()}" var="curPrimaryPropName"
sortBy="#{curSearchResult[curPrimaryPropName].getValue()}"
filterBy="#{curSearchResult[curPrimaryPropName].getValue()}" filterMatchMode="contains">
<f:facet name="header">
<h:outputText value="...." />
</f:facet>
...
</p:dataTable>
我真的被困在这里了。使用c:forEach渲染选项卡可能有问题吗?使用ui:repeat或使用tabView的内置迭代它不起作用。 或者是否不允许直接在SearchInstance迭代变量中设置所选行?
我正在使用JSF 2.2.10和Primefaces 5.1.13。与juel el 2.2.7。
此致 奥利弗