我试图用Primefaces实现JSF-Webapp。在这种情况下,我需要一个内置数据表的Dropdown。 数据表包含超过30.000个条目(3列)。我已经实现了一个虚拟滚动的数据表,工作正常(我仍然需要考虑初始数据加载,如果达到视图结束,可能只能从db加载数据)。
Idea是一个带有String作为值的下拉列表(从数据库生成),在单击下拉列表后,您会看到数据表,用户可以在其中选择一个。所选内容应在提交后写入数据库。
<p:selectOneMenu>
<f:selectItems>
<p:dataTable var="entry" value="#{scrollView.lazyModel}"
scrollRows="20" scrollable="true" virtualScroll="true"
scrollHeight="200" lazy="true" rows="40" style="margin-bottom:0">
<p:column headerText="e1" footerText="e1">
<h:outputText value="#{entry.e1}" />
</p:column>
<p:column headerText="e2" footerText="e2">
<h:outputText value="#{entry.e2}" />
</p:column>
<p:column headerText="e3" footerText="e3">
<h:outputText value="#{entry.e3}" />
</p:column>
</p:dataTable>
</f:selectItems>
</p:selectOneMenu>
编辑:我找到了一个在我的下拉列表中获取列的解决方案(thx!),但如果我这样解决,我就无法使用虚拟滚动。我的问题是,如果滚动条位于下拉列表的底部,我不知道如何检查。我的想法是检查是否真的用新数据重新加载selectonemenu。
XHTML:
<p:selectOneMenu id="test"
value="#{bean.dto == null ? '': bean.dto}"
var="d">
<f:selectItem
itemLabel="#{bean.dto == null ? '': bean.dto}" />
<f:selectItems value="#{docScroll.currentData}" var="doc" itemValue="#{doc}"
itemLabel="#{doc.forename} #{doc.surname}, #{doc.city}" />
<p:column>
#{d.surname}
</p:column>
<p:column>
#{d.forename}
</p:column>
<p:column>
#{d.city}
</p:column>
<f:ajax event="change" onevent="#{scripts.checkScrollBottom}" listener="#{docScroll.reloadData}" update="test"/>
</p:selectOneMenu>
reloadData:
public void reloadData() {
if (pos == data.size() - 1) {
return;
}
pos += range - 1;
if (pos >= data.size()) {
pos = data.size() - 1;
}
currentData = data.subList(0, pos);
}
checkScrollBottom:
function checkScrollBottom(event){
var source = event.target;
if(source.offsetHeight + source.scrollTop == source.scrollHeight){
alter("END!!");
}
}