Primefaces如何更新对话框中的内容并保持对话框居中?

时间:2012-05-18 20:38:08

标签: jsf jsf-2 primefaces

我有一个对话框,其中不包含页面加载的内容,而是根据用户点击的链接动态设置对话框的内容。

<p:dialog widgetVar="dlg" modal="true" id="dialog">
    <p:panel id="fullArticle">
        <h:outputText value="#{content.newsArticle}" escape="false" />
    </p:panel>
 </p:dialog>
...
...
<p:commandLink value="Read more" actionListener="#{content.getFullArticle}" onclick='dlg.show();' update=":fullArticle">
    <f:attribute name="contentId" value="#{news.contentId}" />
</p:commandLink>

我遇到的问题是,当您单击“阅读更多”链接时,它会显示对话框,但对话框不在页面的中心。如果我将commandLink上的udpate属性更改为update=":dialog",则对话框会闪烁,就好像它正在打开然后立即关闭一样。

如何更新对话框并使其与动态内容对齐?

2 个答案:

答案 0 :(得分:36)

在 ajax请求之前执行<{1}} 。您需要在onclick中打开对话框。这将在 ajax请求和更新后执行。默认情况下,oncomplete是隐藏的,除非其<p:dialog>属性评估visible

true

对具体问题

无关,您是否意识到自EL 2.2以来您可以将完全对象作为方法参数传递?这使<p:commandLink value="Read more" actionListener="#{content.getFullArticle}" update=":dialog" oncomplete="dlg.show()"> <f:attribute>“hack”变得多余:

actionListener

答案 1 :(得分:6)

我遇到了同样的问题。 更新对话框会使其消失并重新出现(并忘记其位置)。

为了解决这个问题,我在对话框内容周围创建了一个包装器标签。

<p:commandLink update=":playerViewDialogHeader,:playerViewDialogContent"
               oncomplete='playerViewDialogJS.show()' value='#{item.name}' />


<p:dialog id='playerViewDialog' widgetVar='playerViewDialogJS'>

   <f:facet name="header">
      <h:outputText id="playerViewDialogHeader" value="#{playerController.objectView.name}" />
   </f:facet>

   <h:form id='playerViewDialogContent'>
      <!-- CONTENT GOES HERE -->
   </h:form>

</p:dialog>