2012-05-16 14 views
5

Próbuję przenieść p:dialog się z h:form, bo czytałem, że jest to preferowany sposób (jednak chciałbym, aby zrozumieć przyczynę, bo moja p:dialog wewnątrz a także w pracach form moja aplikacja).f: setPropertyActionListener nie powoływać

Jedyną trudnością jest to, że tytuł okna wymaga dynamicznej aktualizacji. Okno dialogowe jest wyświetlane po kliknięciu przycisku w kodzie p:dataTable.

Oto mój stary xhtml (przed zmianą), które działa prawidłowo:

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

A oto nowy xhtml, z eventBean # setSelectedEvent(), która nie jest wywoływany.

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

Więc znowu, dlaczego w drugim scenariuszu eventBean # setSelectedEvent() jest wywoływana nie? I jeśli to możliwe, dlaczego pierwszy scenariusz nie jest optymalny?

Odpowiedz

4

To nie jest ograniczony do korzystania p:dialog wewnątrz h:form ponieważ może pracować w niektórych przypadkach, ale większość czasu znajdą się zmaga się z jakiegoś nieoczekiwanego zachowania z tym, oto kilka wyjaśnień:

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

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

problem w Twoim przypadku jest to, że metoda jQuery w oncomplete nazywa zanim wartość jest ustawiona z f:setPropertyActionListener. Aby tego uniknąć, należy użyć tego samego rozwiązania, które zastosowano w pierwszym przypadku. A więc:

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

Nie ma potrzeby używania jQuery tutaj.

+0

Dzięki za linki. Niestety seter nie zostaje zwolniony nawet przy konfiguracji. – perissf

+1

Przetestowałem to i działa dobrze. Jeśli setter nie został zwolniony za ciebie, to jedna z faz cyklu JSF nie powiodła się. Dodaj '' do swojej strony i sprawdź, czy nie ma błędów. – Fallup

+0

Masz rację, problem jest gdzie indziej. Pozwól mi zbadać dalej ... – perissf

2

miałem ten sam problem (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> 

i to był mój dialogowe:

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

Więc ... W ten sposób nigdy nie był seter nazywa. Potem zauważyłem, że jeśli opróżniłem okno dialogowe, został wywołany seter.

Więc ja go rozwiązać poprzez umieszczenie oświadczenia „świadczone” na panelu:

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

Chyba nie ma zerowy wskaźnik, który nie jest rejestrowane nigdzie ... w każdym razie tak to działa :)

+0

To zadziałało. Jednak dziwny problem – Makky

Powiązane problemy