2016-08-18 71 views
1

以下問題,我想從我的後臺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。

繼承人從螢火代碼: enter image description here

+0

使用瀏覽器檢查Id確實是「fortschrittForm:fortschritt」。另請嘗試「:fortschrittForm:fortschritt」。如果你在按鈕上使用update =「」fortschrittForm:fortschritt「,會發生什麼? – farrellmr

+0

farrellmr:他們兩個我都檢查過了,如果我在後臺點擊一個很長的進程啓動例如我首先從我的附件下載郵件電子郵件帳戶,在他們之後我閱讀附件等等。因此,對於每一步(下載附件=完成),我想在視圖上顯示成功圖標。爲此,我需要通過我的後端更新我的前端 –

+0

是通話在按鈕更新導致問題 - 將更新部分從按鈕移動到更新方法?此外,在這一點上肯定更新的模型? – farrellmr

回答

0

我的問題是

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

不點火。

您誤解了RequestContext#update方法的行爲。它不會觸發單獨的響應。它只是提供了一種簡單的方法來設置在運行時在當前請求內更新哪些組件,而不是通過標記中的更新屬性對其進行硬編碼。

只要方法完成,所有圖標都會顯示出來。

這是正常的行爲。

客戶端視圖的每次更改都必須由客戶端請求進行。這是它的工作原理(除非你使用套接字或類似的東西)。因此,要反映服務器端長時間運行或複合進程的更新,只要進程正在運行,就必須從客戶端輪詢更新。

E.g. <p:poll />是一個很好的候選人一起去,我會嘗試這樣的事情:

  1. 當請求在客戶端的過程的開始,還與更新屬性設置的目標部分開始<p:poll />視圖。
  2. 當進程在服務器端運行時,分別更新與客戶端視圖的目標部分關聯的模型值。
  3. 當進程在服務器端結束時,請求最終更新視圖的目標部分並停止客戶端的輪詢。

此外,我只是發現了一些有趣的東西,這也許是你的一個選擇。看看PrimeFaces Push

+0

那麼是否有解決方案呢? –

+0

@ Captai-N更新回答問題。 – irieill

+0

謝謝,但沒有做這項工作。問題是,在流程運行期間,投票直到響應完成纔開始投票。 –