2012-05-16 1 views
5

Sto cercando di spostare un p:dialog da un h:form, perché ho letto che questo è il modo migliore (però mi piacerebbe capire il motivo, perché la mia p:dialog all'interno di un form funziona bene in la mia applicazione).f: setPropertyActionListener non invocato

L'unica difficoltà è che il titolo della finestra di dialogo deve essere aggiornato dinamicamente. La finestra di dialogo viene visualizzata quando si fa clic su un pulsante in p:dataTable.

Ecco il mio vecchio xhtml (prima che le modifiche), che sta lavorando bene:

<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> 

Ed ecco la nuova xhtml, con eventBean # setSelectedEvent() che non viene invocato.

<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> 

Così, ancora una volta, perché nel secondo scenario eventBean # setSelectedEvent() non è invocato? E, se possibile, perché il primo scenario non è ottimale?

risposta

4

E non si limita a utilizzare p:dialog all'interno di un h:form dal momento che può funzionare in alcuni casi, ma il più delle volte vi troverete alle prese con qualche comportamento imprevisto con questo, qui ci sono alcune spiegazioni:

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

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

il problema nel tuo caso è che il metodo jQuery in oncomplete viene chiamato prima il valore è impostato con f:setPropertyActionListener. Per evitare questo, utilizzare la stessa soluzione utilizzata nel primo caso. Quindi:

<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> 

Non è necessario utilizzare jQuery qui.

+0

Grazie per i link. Sfortunatamente il setter non viene licenziato neanche con il tuo setup. – perissf

+1

L'ho provato e funziona bene. Se il setter non viene licenziato, allora una delle fasi del ciclo JSF non è riuscita. Aggiungi '' alla tua pagina e controlla gli errori. – Fallup

+0

Hai ragione, il problema è da qualche altra parte. Fammi investigare ulteriormente ... – perissf

2

Ho avuto lo stesso 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> 

e questo è stato il mio dialogo:

<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}" /> 

Quindi ... In questo modo il setter è stato mai chiamato. Poi ho notato che se avessi svuotato la finestra di dialogo è stato chiamato il setter.

Così ho risolto mettendo una dichiarazione "resa" sul pannello:

<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"> 

Credo che ci sia un puntatore nullo che non è connesso da nessuna parte ... comunque in questo modo che funziona :)

+0

Questo ha funzionato. Strano problema però – Makky