2012-05-16 19 views
5

Estoy tratando de mover un p:dialog cabo de un h:form, porque he leído que esta es la manera preferida (sin embargo me gustaría entender la razón, porque mi p:dialog dentro de un form funciona bien en mi aplicación).f: setPropertyActionListener no invoca

La única dificultad es que el título del cuadro de diálogo debe actualizarse dinámicamente. El cuadro de diálogo se muestra cuando se hace clic en un botón en p:dataTable.

Aquí está mi viejo XHTML (antes de los cambios), que está funcionando muy bien:

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" /> 
    ... 
    <p:column headerText="#{msgs.Persons}"> 
     <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsForm" oncomplete="viewPersonsDlg.show()"> 
      <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" /> 
     </p:commandButton> 
    </p:column> 
</p:dataTable> 
<h:form id="viewPersonsForm"> 
    <p:dialog modal="true" widgetVar="viewPersonsDlg" dynamic="true" header="#{eventBean.selectedEvent.name}" > 
     ... 
    </p:dialog> 
</h:form> 

Y aquí está el nuevo XHTML, con eventBean # setSelectedEvent() que no se invoca.

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" /> 
    ... 
    <p:column headerText="#{msgs.Persons}"> 
     <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsDlgId" oncomplete="jQuery('#viewPersonsDlgId .ui-dialog-title').text('#{eventBean.selectedEvent.name}');viewPersonsDlg.show()"> 
      <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" /> 
     </p:commandButton> 
    </p:column> 
</p:dataTable> 
<p:dialog modal="true" id="viewPersonsDlgId" widgetVar="viewPersonsDlg" dynamic="true" > 
    ... 
</p:dialog> 

Así, de nuevo, por lo que en el segundo escenario eventBean # setSelectedEvent() no es invocado? Y, si es posible, ¿por qué el primer escenario no es óptimo?

Respuesta

4

No se limita a utilizar p:dialog dentro de un h:form ya que puede funcionar en algunos casos, pero la mayoría de las veces se encontrará luchando con un comportamiento inesperado con eso, he aquí algunas explicaciones:

Why not to place p:dialog inside h:form 1

Why not to place p:dialog inside h:form 2

el problema en su caso es que el método jQuery en oncomplete se llama antes de que el valor se establece con f:setPropertyActionListener. Para evitar esto, use la misma solución que utilizó en su primer caso. Entonces:

<p:dataTable var="event" value="#{eventBean.lazyModel}" selection="#{eventBean.selectedEvent}" /> 
    ... 
    <p:column headerText="#{msgs.Persons}"> 
     <p:commandButton value="#{msgs.ViewPersons}" update=":viewPersonsDlgId" oncomplete="viewPersonsDlg.show()"> 
      <f:setPropertyActionListener value="#{event}" target="#{eventBean.selectedEvent}" /> 
     </p:commandButton> 
    </p:column> 
</p:dataTable> 
<p:dialog modal="true" id="viewPersonsDlgId" widgetVar="viewPersonsDlg" dynamic="true" header="#{eventBean.selectedEvent.name}" > 
    ... 
</p:dialog> 

No necesita usar jQuery aquí.

+0

Gracias por los enlaces. Lamentablemente, el colocador no se dispara, incluso con su configuración. – perissf

+1

Lo he probado y funciona bien. Si el colocador no se dispara por usted, entonces una de las fases del ciclo JSF falló. Agregue '' a su página y verifique si hay errores. – Fallup

+0

Tienes razón, el problema está en otro lado. Déjame investigar más ... – perissf

2

que tenían el mismo problema (PF 3.5):

<p:tabView id="cashFlowTabContainer" style="width:100%" activeIndex="0" 
    widgetVar="cashFlowTabContainerVar"> 
    <p:tab title="#{labels['cashflow_incoming']}"> 
     <p:outputPanel id="incomingPanel"> 
      <p:dataTable value="#{cashFlowController.incomingCashFlows}" 
       var="cashFlow"> 
<p:column headerText="#{labels.cashflow_actions}"> 
        <p:commandButton value="Edit" 
         action="# {cashFlowController.editIncoming}" update="@form" oncomplete="editInputVar.show();"> 
         <f:setPropertyActionListener  value="#{cashFlow}" 
          target="#{cashFlowController.selectedIncoming}" /> 
        </p:commandButton> 
       </p:column> 

y esto fue mi diálogo:

<p:dialog id="editInput" header="Dynamic Dialog" 
    widgetVar="editInputVar" resizable="false" draggable="false" 
    modal="true"> 
    <p:panel> 
     <h:panelGrid columns="2" cellpadding="5"> 
... 
<h:outputText value="#{labels.cashflow_description}:" /> 
      <h:inputText 
       value="#{cashFlowController.selectedIncoming.description}" /> 

Así que ... De esta manera el colocador nunca fue llamado. Entonces noté que si vaciaba el diálogo, se llamaba al colocador.

Así lo solucioné poniendo una declaración "se traduce" en el panel:

<p:dialog id="editInput" header="Dynamic Dialog" 
    widgetVar="editInputVar" resizable="false" draggable="false" 
    modal="true"> 
    <p:panel **rendered="#{cashFlowController.selectedIncoming != null}"**> 
     <h:panelGrid columns="2" cellpadding="5"> 

Creo que hay un puntero nulo que no está conectado a ninguna parte ... de todos modos esta manera funciona :)

+0

Esto funcionó. Problema extraño sin embargo – Makky

Cuestiones relacionadas