Primefaces数据表更新数据表

时间:2015-01-06 16:34:23

标签: jsf primefaces datatable

我对primefaces数据表有问题。我有一个带有一些条目的数据表和一个带有按钮的列。如果按下该按钮,则会打开另一个数据表的弹出窗口。第二个数据表中的条目取决于按下按钮的行。

<!-- first datatable -->
<h:form id="list">
<p:dataTable id="list1" var="item" value="#{bean1.itemlist}"
   rowKey="#{item.id}" selection="#{bean1.selectedItem}"
   selectionMode="single">

    <p:column headerText="ID">
        <h:outputText value="#{item.id}" />
    </p:column>
    ...
    <p:column headerText="Edit Entries">
        <p:commandButton value="Edit Entries"
            actionListener="#{bean2.updateEntries(item)}" ajax="true"
            oncomplete="PF('edit_entries').show()" />

         </p:column>
</p:dataTable>

<!-- Second datatable in the popup -->
<p:dialog header="Edit Entries" widgetVar="edit_entries" modal="true"
    resizable="false">
        <p:dataTable id="list2" var="entry"
            value="#{bean2.entriesList}" rowKey="#{entry.id}"
            selection="#{bean2.selectedEntry}" selectionMode="single">
            <p:column headerText="Entry Number">
                <h:outputText value="#{entry.number}" />
            </p:column>
        </p:dataTable>
        <f:facet name="footer">
             <p:commandButton value="Save" oncomplete="PF('edit_entries').hide()" />
        </f:facet>
</p:dialog>
</form>

Bean2

public void updateEntries(Item selectedItem) {
    this.entriesList = this.entriesQuery.getAllEntriesByItemID(selectedItem.getId());//db query could take some time
    System.out.println("entrieslist size: " + this.entriesList.size()); //prints the correct size
}

问题是弹出数据表中没有列出条目,尽管db查询后列表中有一些条目。

任何想法如何修复此错误? 提前谢谢!

更新1:

<!-- first datatable -->
<h:form id="list">
<p:dataTable id="list1" var="item" value="#{bean1.itemlist}"
   rowKey="#{item.id}" selection="#{bean1.selectedItem}"
   selectionMode="single">

    <p:column headerText="ID">
        <h:outputText value="#{item.id}" />
    </p:column>
    ...
    <p:column headerText="Edit Entries">
        <p:commandButton value="Edit Entries" update=":dialogUpdateEntries"
            actionListener="#{bean2.updateEntries(item)}" ajax="true"
            oncomplete="PF('edit_entries').show()" />

         </p:column>
</p:dataTable>
</h:form>

<!-- Second datatable in the popup -->
<p:dialog header="Edit Enries" id="dialogUpdateEntries" widgetVar="edit_entries" modal="true"
    resizable="false">
    <h:form id="formEntriesList">
        <p:dataTable id="list2" var="entry"
            value="#{bean2.entriesList}" rowKey="#{entry.id}"
            selection="#{bean2.selectedEntry}" selectionMode="single">
            <p:column headerText="Entry Number">
                <h:outputText value="#{entry.number}" />
            </p:column>
        </p:dataTable>
        <f:facet name="footer">
             <p:commandButton value="Save" oncomplete="PF('edit_entries').hide()" />
        </f:facet>
    </form>
</p:dialog>

2 个答案:

答案 0 :(得分:3)

您确实没有更新对话框中的数据表。 JSF不会自动更新模型更改的视图,您必须明确告诉视图这样做。您可以使用ajax操作组件的update属性。这需要一个JSF客户端ID,可以通过相关答案中概述的规则找到:How to find out client ID of component for ajax update/render? Cannot find component with expression "foo" referenced from "bar"

鉴于问题中显示的标记,那将是

<p:commandButton ... update=":list:list2" />

但是,还有另一个潜在的问题。您在表单中使用<p:dialog modal="true"> ,而不是将对话框设置为自己的表单。这样,对话框可能在HTML DOM树中不可用,因为JavaScript(负责处理ajax的东西)会期望找到它。给对话框自己的形式应该解决这个问题。它还将修复从对话框内调用操作的潜在未来问题,如相关问题所述:<p:commandbutton> action doesn't work inside <p:dialog>

<h:form id="viewForm">
    ...
    <p:commandButton ... update=":editDialog" />
    ...
</h:form>

<p:dialog id="editDialog" modal="true">
    <h:form id="editForm">
        ...
    </h:form>
</p:dialog>

答案 1 :(得分:0)

尝试将update="list2"添加到“编辑条目”命令按钮(即使update="@widgetVar(edit_entries)"也可以)。

如果由于页面布局和结构的原因,您无法使用上述建议定位第二个数据表,请将styleClass="tList2"添加到第二个表,然后在编辑按钮上使用update="@(.tList2)"进行更新。