Primefaces 数据表更新数据表
Primefaces datatable update 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
}
问题是弹出数据表中没有列出任何条目,尽管在数据库查询后的列表中有一些条目。
有什么办法可以解决这个错误吗?
提前致谢!
更新 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>
尝试将 update="list2"
添加到“编辑条目”命令按钮(即使 update="@widgetVar(edit_entries)"
也应该有效)。
如果,由于页面布局和结构,您无法使用上述建议定位第二个数据table,则将 styleClass="tList2"
添加到第二个 table,并更新它update="@(.tList2)"
在编辑按钮上。
您确实没有更新对话框中的数据 table。 JSF 不会在模型更改时自动更新视图,您必须明确告诉视图这样做。为此,您可以使用 ajax 操作组件的 update
属性。这需要一个 JSF 客户端 ID,该 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">
inside 表单中使用,而不是为对话框提供自己的表单。这样,对话框可能在 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>
我对 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
}
问题是弹出数据表中没有列出任何条目,尽管在数据库查询后的列表中有一些条目。
有什么办法可以解决这个错误吗? 提前致谢!
更新 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>
尝试将 update="list2"
添加到“编辑条目”命令按钮(即使 update="@widgetVar(edit_entries)"
也应该有效)。
如果,由于页面布局和结构,您无法使用上述建议定位第二个数据table,则将 styleClass="tList2"
添加到第二个 table,并更新它update="@(.tList2)"
在编辑按钮上。
您确实没有更新对话框中的数据 table。 JSF 不会在模型更改时自动更新视图,您必须明确告诉视图这样做。为此,您可以使用 ajax 操作组件的 update
属性。这需要一个 JSF 客户端 ID,该 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">
inside 表单中使用,而不是为对话框提供自己的表单。这样,对话框可能在 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>