PrimeFaces对话框引用父对象

时间:2013-08-03 18:49:17

标签: jsf primefaces facelets

我有一个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使用。

1 个答案:

答案 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