【问题标题】:Dialog content does not get updated对话内容未更新
【发布时间】:2013-07-16 00:21:57
【问题描述】:

我已经搜索了几个小时,我发现了一些与之相关的 stackoverflow 问题,但找不到解决方案。我有一个显示日志文件内容的 primefaces 对话框。按下按钮时会显示对话框。我的问题是,一旦显示对话框,内容就永远不会更新。也就是说,永远不会调用 #{pvtRunner.pvtLog} 方法。如何让我的对话框在每次显示时都调用此方法,而不仅仅是第一次?

<h:head>
</h:head>

<h:body>
    <p:dialog id="logDialog" header="PVT Log" widgetVar="dlg" height="400" width="600" dynamic="true">
        <h:outputText id="logDialogContnet" value="#{pvtRunner.pvtLog}" escape="false"/>
    </p:dialog>

    <h:form>
        <p:panelGrid id="mainPanelGrid" columns="1" styleClass="panelGridBorder panelGridCenter">
            ....
            <p:commandButton id="showLog" value="Show Log" onclick="dlg.show()" type="button" update=":logDialogContnet"/>
        </p:panelGrid>
    </h:form>
</h:body>

这是应该更新对话框内容的 java 方法:

public String getPvtLog() {
        String result = "";
        try {
            File logFile = new File(instanceRoot + "\\config\\ProcessVerification.log");
            InputStream fis = new FileInputStream(logFile);
            result = readStream(fis);
        } catch (IOException e) {
            log.severe(e.getMessage());
        }
        return result;
}

谢谢

【问题讨论】:

  • 你能发布你正在调用的方法的代码pvtRunner.pvtLog吗?您确定值发生了变化并且没有更新,还是值没有变化并且有更新?
  • 我正在调试 - 我只在第一次调用时遇到了断点。
  • 如果该对话框能够在请求生命周期内向服务器发送任何请求,则该对话框需要位于 &lt;h:form/&gt; 内。还将您在getPvtLog 中正在进行的处理移动到其他地方,可能是&lt;p:commandButton/&gt; 的onclick。否则,您将自己设置为代码中的一些长期错误

标签: html ajax jsf primefaces


【解决方案1】:

首先,stop doing your business logic in your getter。你应该简单地归还财产。以下是您可以使用的一种方法。请务必检查链接。

修改你的getPvtLog()

public String getPvtLog() {
    return result;
}

然后在&lt;p:commandButton&gt;中定义一个用于你的actionListener的方法来更新result。示例:

public void click() {    
    try {
        File logFile = new File(instanceRoot + "\\config\\ProcessVerification.log");
        InputStream fis = new FileInputStream(logFile);
        result = readStream(fis);
    } catch (IOException e) {
        log.severe(e.getMessage());
    }
    return result;
}

根据需要更改方法名称。这只是一个简单的例子。

现在删除type="button",而不是onclick,将其更改为oncompleteonclick 在 ajax 请求之前执行,您希望 &lt;p:dialog&gt; 在 ajax 请求之后弹出。顺便说一句,我相信这是您的主要问题。还要在您的&lt;p:commandButton&gt; 中添加actionListener

<p:commandButton id="showLog" actionListener="#{pvtRunner.click()}" value="Show Log" oncomplete="dlg.show()" update=":logDialogContnet"/>

示例

<p:dialog id="logDialog" header="PVT Log" widgetVar="dlg" height="400" width="600" dynamic="true">
    <h:outputText id="logDialogContnet" value="#{pvtRunner.pvtLog}" escape="false"/>
</p:dialog>
<h:form>
    <p:panelGrid id="mainPanelGrid" columns="1" styleClass="panelGridBorder panelGridCenter">
        <p:commandButton id="showLog" actionListener="#{pvtRunner.click()}" value="Show Log" oncomplete="dlg.show()" update=":logDialogContnet"/>
    </p:panelGrid>
</h:form>

【讨论】:

  • 谢谢。现在可以了。我重构了 get 方法——它只是暂时的
【解决方案2】:

如果要成功调用getPvtLog(),对话框应该有自己的&lt;h:form/&gt;。根据 JSF 规则,只有封装在表单中的组件才能向服务器发送流量。所以你应该有:

<p:dialog id="logDialog" header="PVT Log" widgetVar="dlg" height="400" width="600" dynamic="true">
   <h:form>
    <h:outputText id="logDialogContnet" value="#{pvtRunner.pvtLog}" escape="false"/>
   </h:form>
</p:dialog>

在不相关的注释中,您应该将 getPvtLog() 中的所有逻辑移到该方法之外。

看看为什么:

【讨论】:

  • 我试过你的答案。它不起作用。问题在于onclick,因为它是在ajax 请求之前执行的。 &lt;p:dialog&gt; 是否在 &lt;h:form&gt; 中并不重要。我可以更新我的答案,如果您愿意,您可以自己尝试。也许我没有看到你所做的一切,但我所做的只是使用他的代码并按照你的建议添加表格。我什至有一个愚蠢的PvtRunner 课程。也许我错过了什么?
  • 甚至尝试通过在onclick 中添加表单处理来将您的答案与您的评论混合,但它仍然不起作用。该值永远不会更新。
  • @Andy - 我不是字面上的意思是onclick 事件。可以使用&lt;p:commandButton/&gt;action属性初始化数据,然后使用按钮的oncomplete事件调用dlg.show()。我会用 sn-p 更新我的答案
  • 哦,没关系。那时我们正在做(几乎)同样的事情。而且,您不需要&lt;p:dialog&gt; 的内容在&lt;h:form&gt; 中。它只包含outputText,它不向服务器发送数据。没有它也可以工作。
  • @Andy - 如果getPvtLog() 不在&lt;h:form/&gt; 中,则不会调用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 2023-03-13
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
相关资源
最近更新 更多