18

我有一个在页面加载时不包含任何内容的对话框,并且我正在根据用户单击的链接动态设置对话框的内容。

<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",则对话框会闪烁,好像它正在打开然后立即关闭。

如何更新对话框并使其以动态内容为中心?

4

2 回答 2

42

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

<p:commandLink value="Read more" actionListener="#{content.getFullArticle}" 
    update=":dialog" oncomplete="dlg.show()">

与具体问题无关,您是否知道自 EL 2.2 以来您可以将完全有价值的对象作为方法参数传递?这使得<f:attribute>and actionListener“hack” 是多余的:

<p:commandLink value="Read more" action="#{content.getFullArticle(news)}" 
    update=":dialog" oncomplete="dlg.show()" />
于 2012-05-18T20:39:59.967 回答
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>
于 2012-09-21T10:35:36.517 回答