仅在显示复合组件代码时才执行它

时间:2013-05-22 12:51:31

标签: java jsf primefaces dialog

我在PrimeFaces对话框中有一个JSF复合组件,dynamic = true(动态 - 允许使用ajax延迟加载内容)。该组件在覆盖encodeBegin方法内初始化。显示对话框时会发生这种情况。

如果删除动态属性,则在未显示对话框时也会调用encodeBegin方法并破坏现有代码。

是否可以仅在显示对话框时执行复合组件代码?

以下是代码选择:

<p:dialog id="actionsDialog"
    widgetVar="actionsDialogWidget" resizable="false" width="800"
    height="600" showEffect="fade" hideEffect="fade" modal="true">
    <h:form id="confirmationWizardForm">
        <acme:actionWizard name="wizard" widgetVar="wiz" bean="#{accountsBean}"
            header="#{accountsBean.entityHeader}"
            update="form:genericAccounts" onClose="actionsDialogWidget.hide()" />
    </h:form>
</p:dialog>

...

<p:commandButton value="Add"
    action="#{accountsBean.initializeEntity}" process="@this"
    update=":actionsDialog" oncomplete="actionsDialogWidget.show()">

1 个答案:

答案 0 :(得分:2)

问题在于您正在控制来自客户端的可见性,这意味着会生成对话框的标记,但仍会被css规则隐藏。

这可以被注意到例如分析素数dialog showcase - 在那里,对话框被隐藏,直到您按下“基本”命令按钮,但HTML <div id="basicDialog"...始终存在,即使对话框窗口不可见。

如果对话框被渲染,那么内容也是如此 - 没有动态内容丢失就没有停止。

添加动态属性会改变行为,因为ajax用于在显示对话框时(及其内容)获取对话框。