我有一个xhtml页面,显示带有条目的数据表。我还有一个用于插入新条目的按钮,该按钮显示具有表单的对话框。插入表单在父.xhtml中用作<ui:include>
,如下所示:
父文件
<h:form id="mainForm">
<p:commandButton process="@form" update=":dlgGrp" oncomplete="dlg.show()"/>
<p:datatable id = "datatable">
various columns
.....
.....
</p:datatable>
</h:form>
<p:dialog widgetVar="dlg" >
<h:panelGroup id="dlgGrp">
<ui:include src="include.xhtml" />
</h:panelGroup>
</p:dialog>
</ui:composition>
对话文件
<ui:composition xmlns . . .>
<h:form id="subForm">
various input fields
......
......
<p:commandButton process="@form" update=":mainForm" oncomplete="dlg.hide()"/>
</h:form>
</ui:composition>
如何在文件中显示一般性地引用父组件。只要我点击对话框中的提交按钮,我就想更新主窗体并隐藏对话框。然而,这些组件位于“父域”中。
这可能应该通过支持bean以编程方式完成,因为我不想在子.xhtml中包含父特定于操作的操作,因为我可能还想将它作为独立的.xhtml使用。
答案 0 :(得分:2)
如果您想通过mainForm
中的方法更新backingBean
。只需修改
<p:commandButton process="@form" action="#{backingBean.method}" oncomplete="dlg.hide()"/>
并在backingBean
执行以下操作(see Primefaces Showcase):
public void method() {
// do something
RequestContext context = RequestContext.getCurrentInstance();
context.update(":mainForm");
}
如果mainForm
已经在另一个NamingContainer中,您只需要检查一下。
如果是,则需要相应地更改context.update(...)
。
此外,如果您想从支持bean更新mainForm
,我还建议将对话框隐藏在backingBean
中,具体取决于处理的输入。如果是有些数据无效,您不想隐藏对话框。目前无法通过您的oncomplete
操作完成此操作,该操作在收到服务器的响应后自动执行。无论输入是否正确,对话框都会关闭。
添加到method()
:
if (everythingWentFine) {
context.execute("dlg.hide();");
}
并从oncomplete
中删除p:commandButton
。