2013-01-16 68 views
4

我正在使用<p:dialog>。在提交表單後,我使用dialog.hide(),它觸發ajax關閉事件偵聽器方法,該方法將更新List<E>。 它工作正常,但是當我放入一些必需的輸入組件並在出現一些驗證錯誤時再次帶上<p:dialog>時,它再也不會觸發該方法。p:使用dialog.hide時,dialog不會觸發ajax關閉事件()

對話框:

<p:outputPanel autoUpdate="true"> 
    <p:dialog id="dialogComentario" header="Deixe sua avaliação" widgetVar="confirmation" 
     showEffect="fade" hideEffect="fade" height="340" width="500" modal="true" 
     visible="#{not empty facesContext.maximumSeverity}" 
     resizable="false" closable="true" draggable="false"> 
     <h:form prependId="false"> 
      ... 
      <p:commandLink styleClass="btn btn-primary btenviacoment" 
       oncomplete="if (!args.validationFailed) confirmation.hide();" 
       actionListener="#{comentario.actEnviarComentario}" global="false"> 
       <i class=" icon-play-circle icon-white"></i> 
       <h:outputText value=" Enviar Comentário" /> 
       <f:param name="codigoplu" value="#{produto.produto.codigoplu}" /> 
      </p:commandLink> 
      ... 
      <p:commandLink styleClass="btn" onclick="confirmation.hide();" 
       global="false" immediate="true"> 
       <h:outputText value=" Cancelar" /> 
       <i class="icon-off"></i> 
      </p:commandLink> 
      ... 
     </h:form> 
     <p:ajax event="close" update=":avaliacoesClientes, :dialogComment" 
      listener="#{produto.atualizarComentarios}" global="false" /> 
    </p:dialog> 
</p:outputPanel> 

的動作監聽器方法:

public void actEnviarComentario(ActionEvent event) { 
    String codigoplu = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("codigoplu"); 
    PegarDadosCliente(); 

    try { 
     DateFormat f = new SimpleDateFormat("dd/MM/yyyy"); 
     java.util.Date utildata = new java.util.Date(); 
     utildata = (java.util.Date) f.parse(String.valueOf(data.getValue())); 
     java.sql.Date datasql = new java.sql.Date(utildata.getTime()); 

     Comentario comentario = new Comentario(Integer.parseInt(usuario.getId()), Integer.parseInt(codigoplu), titulo.getValue().toString(), mensagem.getValue().toString(), datasql, Integer.parseInt(rating.getValue().toString()), new java.sql.Date(new Date().getTime())); 
     listavelComentarios.inserirComentario(comentario); 

     RequestContext.getCurrentInstance().execute("confirmation.hide();"); 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 
} 

我試圖關閉與RequestContext對話框,如圖中的操作方法,但不會觸發Ajax關閉事件無論是。

這裏的AJAX關閉事件偵聽器方法:

public void atualizarComentarios(CloseEvent event) { 

    try { 
     comentarios = comentario.listarComentarios(codigoplu); 

     if (comentarios.size() > 0) { 
      msgAvaliacao = "Avaliação do produto."; 
      int votos = 0; 

      for (Comentario comentario : comentarios) { 
       votos += comentario.getAvaliacao(); 
      } 

      rating = votos/comentarios.size(); 
     } 
    } catch (NamingException e) { 
     e.printStackTrace(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 
} 
+0

你可以發表'p:dialog'標籤嗎? – partlov

+0

對不起,我錯過了。更新。 –

+0

是否需要以* Ajax *的方式執行?我提出這個問題是因爲我看到你以某種方式使你的代碼複雜化。我認爲使用'h:commandLink'與'action'方法和'ajax =「false」'相比更容易。這將提交,你可以刷新你想要的內容,一旦回到對話框將不會顯示。 –

回答

2

這個問題是不相關的驗證。刪除所有這些輸入組件,然後按下命令按鈕/鏈接,您會看到它仍未被觸發。

此問題是由<p:outputPanel autoUpdate="true">visible="#{not empty facesContext.maximumSeverity}"的不必要組合引起的。輸出面板不斷自動更新對話框,這顯然迫使你設置這樣的visible屬性。該對話框在oncomplete事件被觸發之前自動更新。如果對話框visible屬性爲false,則在觸發oncomplete之前,該對話框已被隱藏(隱藏)。

所以,剛剛擺脫<p:outputPanel>visible屬性。您的oncomplete已經做了正確的工作。


無關到混凝土問題,RequestContext線是不必要的。你已經將它隱藏在oncomplete這完全沒問題。另見Keep p:dialog open when a validation error occurs after submit

+0

謝謝你的回答,@BalusC。但是當我使用另一個按鈕「取消」,它只是使用'onclick =「confirmation.hide();」關閉事件被調用。 –

+0

你說得對。這很可能只是PrimeFaces中的一個錯誤,它在當前處理回發時不會調用close事件。我相應地編輯了答案。你可能想把它報告給PF傢伙。 – BalusC

+0

我做了另一個測試@Balusc,並將「取消」按鈕更改爲「oncomplete」,並且工作正常(仍然調用close事件)!此外,我用這種方法稱爲(關閉事件),但我有問題,以保持當驗證錯誤發生時...我做了

相關問題