【问题标题】:Primefaces : update dialog content and keep it openPrimefaces:更新对话框内容并保持打开状态
【发布时间】:2014-08-31 13:49:50
【问题描述】:

我正在使用 JSF 和 PrimeFaces,但无法处理以下情况: 我有一个对话框,我在上面放置了一个数据表。在表格的一个单元格中,我想以 3 种不同的方式显示给定的数据,并且我想在它们之间切换。到目前为止,我设法通过 commandLink 在这些渲染类型之间切换,但我的问题是当我单击 3 个链接之一时,对话框关闭!我可以更新对话框的内容,并能够同时保持打开状态吗? (我正在通过 myMethod 更新要使用的渲染类型)

我的 commandLink 如下所示:

<p:commandLink id="id" update=":myForm:myDialog" ajax="false"
               action="#{myBean.myMethod}" oncomplete="dialog.show()">

如果我不使用ajax=false属性,则方法不会被调用,我也尝试过imediate=true,但也不是这样。

【问题讨论】:

    标签: jsf jsf-2 primefaces dialog


    【解决方案1】:

    我也遇到了同样的问题,解决办法是更新一个form而不是对话框。例如:

    <p:dialog id="id_dialog" ...>
      <h:form id="id_form">
          ... content
      </h>
    </p:dialog>
    

    和commandLink:

    <p:commandLink update=":id_form" process="@all" ...>
    

    这对我有用!

    【讨论】:

    • 您的答案实际上与已经给出的答案相同。唯一的区别是您在其中放置了一个表单而不是一个面板。题外话:不建议process="@all"。当存在多个表单时可能会导致奇怪的效果。
    • 感谢您的建议,但我不同意您的看法。我的答案与给定的相似,但有一个很大的不同:这个解决方案有效。我也尝试了给定的解决方案,但没有成功。好的,process="@all" 不是必需的。
    • 嗨我也有同样的问题,但你的解决方案对我不起作用。是否取决于 primefaces 版本?
    • 嗨@Moussa。是的,这可能是与版本相关的问题。对不起,但我不记得我的情况是什么版本。不幸的是,我不再有权访问该项目。
    • 好的,谢谢@akelec 终于得到了另一个解决方案,避免在我的情况下使用 commandButton。
    【解决方案2】:

    您需要在对话框中定义 p:outputPanel 并更新输出面板,而不是对话框本身(这就是您的对话框关闭的原因):

    <p:dialog id="myDialog" ...>
      <p:outputPanel id="myOutputPanel">
        ... your dialog content goes here
      </p>
    </p:dialog>
    

    并更改您的命令链接

    <p:commandLink id="id" update=":myForm:myDialog:myOutputPanel" ajax="true"
               action="#{myBean.myMethod}" oncomplete="dialog.show()">
    

    关于oncomplete="dialog.show()" - 我不完全确定你是否需要它。如果您提供有关您的表格和代码的更多代码,则可以给出准确的答案。

    【讨论】:

    • 我不认为包括输出面板和更新它有任何区别。我遇到了同样的问题,我在没有添加 oncomplete="dialog.show()" 的情况下测试了这个理论,并且对话框仍然关闭。 oncomplete="dialog.show()" 会让它再次显示,但它不是一个理想的解决方案,因为当对话框消失并重新出现时会有闪烁。
    • 你不认为这有什么不同吗?试一试,确实可以。因为在一种情况下,整个对话框都会更新(更新:将其从 DOM 中删除并将其重新添加到 DOM),或者在第二种情况下,只是对话框内的输出面板被更新并且对话框保持不变。
    • 不同之处在于Q有ajax="false"(onComplete在哪里工作......)并且你使用隐含的ajax="true",所以两者都是正确的(如果ajax部分是没有改变)
    猜你喜欢
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多