Primefaces Dropdown with Datatable

时间:2018-03-29 14:05:59

标签: jsf primefaces

我试图用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!!");
}

}

0 个答案:

没有答案