使用后端更新视图,无法正常工作

时间:2016-08-18 07:48:16

标签: primefaces

以下问题,我想从我的支持bean更新我的前端。

查看:

<p:layoutUnit id="center" position="center">
        <p:layout>
            <p:layoutUnit id="inner_north" position="north" size="100">
                <h:form id="fortschrittForm">
                    <h:panelGrid columns="10" id="fortschritt" cellspacing="7" title="Fortschritt" cellpadding="6">
                        <h:outputText value="Mails heruntergeladen:"/>
                        <p:graphicImage library="img" name="erfolg.png"
                            rendered="#{managedBean.mails}" />
                        <h:outputText value="Pdfs wurden gelesen:"/>
                        <p:graphicImage library="img" name="erfolg.png"
                            rendered="#{managedBean.pdfs}" />
                    </h:panelGrid>
                </h:form>
                [...]

按钮:

   <p:commandButton value="Transition starten"  actionListener="#{managedBean.prozessablauf}" update=":formTabelle:formDetail:msg anzeigeRisiko"/>

后端:

public void prozessablauf() {
    try {
emailHerunterladen();
mails = true;
RequestContext.getCurrentInstance().update("fortschrittForm:fortschritt");

 } catch (Exception e) {
        e.printStackTrace();
    }

我的问题是

RequestContext.getCurrentInstance().update("fortschrittForm:fortschritt");

没有开火。完全完成该方法后,将显示所有图标。但我特别想要更新fortschrittForm。

来自firebug的代码: enter image description here

1 个答案:

答案 0 :(得分:0)

  

我的问题是

RequestContext.getCurrentInstance().update("fortschrittForm:fortschritt");
     

没有开火。

你误解了RequestContext#update方法的行为。 不会触发单独回复。它只是提供了一种简单的方法来设置在运行时在当前请求中更新哪些组件,而不是通过标记中的 update 属性对其进行硬编码。

  

当方法完成后,所有图标都会显示。

这是正常行为。

客户端对视图的每次更改都必须来自客户端的请求。这是它的工作原理(除非你使用套接字或类似的东西)。因此,要反映服务器端长时间运行或复合进程的更新,只要进程正在运行,就必须从客户端轮询更新。

E.g。 <p:poll />是一个非常好的候选人,我会尝试这样的事情:

  1. 在客户端请求启动流程时,也请将{em> update 属性设置为视图的目标部分,启动<p:poll />
  2. 当进程在服务器端运行时,请更新与客户端上的视图的目标部分关联的模型值。
  3. 当进程在服务器端结束时,请求最终更新视图的目标部分并停止在客户端进行轮询。
  4. 此外,我发现了一些有趣的东西,也可能是你的选择。看看PrimeFaces Push