3

我有一个显示带有条目的数据表的 xhtml 页面。我还有一个按钮来插入一个新条目,它显示一个包含表单的对话框。插入表单<ui:include>在父 .xhtml 中使用如下:

父文件

    <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。

4

1 回答 1

2

如果要mainForm通过backingBean. 只需修改

<p:commandButton process="@form" action="#{backingBean.method}" oncomplete="dlg.hide()"/>

并在您backingBean执行以下操作(请参阅 Primefaces Showcase):

public void method() {
  // do something
  RequestContext context = RequestContext.getCurrentInstance();
  context.update(":mainForm");
}

您只需要检查您mainForm是否已经在另一个NamingContainer中。如果是这样,您需要context.update(...)相应地更改。

此外,如果您想mainForm从您的支持 bean 更新 ,我还建议将对话框隐藏在 中backingBean,具体取决于处理的输入。例如,如果某些数据无效,您不想隐藏对话框。目前无法通过您oncomplete在收到服务器响应后自动执行的操作来完成此操作。无论输入是否正确,对话框都会关闭。

所以添加到method()

if (everythingWentFine) {
  context.execute("dlg.hide();");
}

oncomplete从您的p:commandButton.

于 2013-08-03T19:39:08.740 回答