2013-02-22 8 views
5

Mam JSF stronę facelet tak (wersja niezwykle uproszczonej):Primefaces p: dialog nie zawsze pojawiają się, gdy zmiana = „DLG” w CommandButton

<h:form id="frmAnagPersonName"> 
     <p:commandButton value="Edit" icon="ui-icon-gear" 
         update="@form :frmEdit" 
         onsuccess="_dlgEdit.show()"/> 
     ... 
     <p:dataTable etc... 
     ... 


    </h:form> 

    <p:dialog id="dlgEdit" widgetVar="_dlgEdit" dynamic="true" modal="true" closable="true" 
       header="Person Identity"> 
     <h:form id="frmEdit" > 
      <p:panelGrid id="pnlEdit" columns="2"> 
       <p:outputLabel id="lblName" for="eName" value="Name"/> 
       <p:inputText id="eName" value="#myBean.personName}" 
      </p:panelGrid> 
     </h:form> 
    </p:dialog> 

To działa dobrze, dopóki nie szuka dynamyc nagłówka w oknie:

<p:dialog ... header="#{myBean.header}" ... > 

w tym momencie muszę zmienić atrybut update w p:commandButton:

update="@form :dlgEdit" 

Ale w takim przypadku okno dialogowe pojawi się tylko przy pierwszym kliknięciu przycisku. Nie pojawi się po raz drugi, a potem znowu się pojawi ...
Dlaczego? Jak mogę zawsze wyświetlać okno dialogowe?

Dziękuję

+0

Jaka wersja PF to jest? spróbuj ustawić 'appendToBody =" true "' w twoim oknie dialogowym. Zwróć także uwagę na różnicę w stanie DOM, gdy okno dialogowe pokazuje Vs, gdy nie jest – kolossus

+0

Zwróć również uwagę na stan, w którym pojawia się okno dialogowe: OnSuccess. Co blokuje ten sukces? – kolossus

+0

Używam PrimeFaces 3.5. 'appendToBody'has brak efektu. Zarówno 'oncomplete' jak i' onsuccess' są wywoływane (próbowałem z JS 'alert()'). Jak mogę obserwować stan DOM? (przepraszam za moją ignorancję ;-)) – yankee

Odpowiedz

11

Użyj oncomplete atrybutów zamiast atrybutu onsuccess.

<p:commandButton ... update="@form :dlgEdit" oncomplete="_dlgEdit.show()" /> 

Atrybut onsuccess jest wywoływany bezpośrednio po ajax odpowiedź zostanie pomyślnie przybył jednak na długo przed Ajax aktualizacje są wykonywane na podstawie odpowiedzi ajax. Atrybut oncomplete jest wywoływany po pomyślnym zakończeniu aktualizacji ajax. Zobacz także the tag documentation of <p:commandButton>.

Zasadniczo, jest to rozkaz wywołania zdarzenia:

  • onclick obsługi jest wywoływana
  • żądania ajax jest przygotowana z danych formularzy opartych na process
  • onbegin obsługi jest wywoływana
  • żądania AJAX jest wysyłany
  • Odpowiedź ajax została pomyślnie odzyskana (kod stanu HTTP to 200)
  • onsuccess obsługi jest wywoływana
  • Ajax aktualizacje są wykonywane w HTML DOM na podstawie update
  • oncomplete obsługi jest wywoływana
+0

Dodam tylko, że moja opinia jest taka, że ​​'dynamic =" true "' w tym przykładzie nie ma sensu, ponieważ okno dialogowe jest już całkowicie zaktualizowane po żądaniu AJAX, więc w odpowiedzi AJAX pojawi się całe okno dialogowe, a kolejne żądanie AJAX będzie dynamicznie ładować okno dialogowe. – partlov

+0

@partlov: Tak, rzeczywiście, ten atrybut można pominąć. Jest jednak użyteczne, jeśli masz stosunkowo dużą zawartość w oknie dialogowym i nie chcesz jej natychmiast ładować na żądanie początkowe, ale tylko wtedy, gdy okno dialogowe jest otwarte po raz pierwszy. – BalusC

+0

Nie wiem dokładnie, jak zachowają się tutaj Primefaces, ale jeśli dynamiczne okno dialogowe zostanie całkowicie zaktualizowane, może być w stanie "nie załadowane", ponieważ jest początkowo załadowane.Czy ładowanie okna dialogowego AJAX zostanie ponownie uruchomione? Może się mylę, ale nie jestem teraz w sytuacji, żeby to sprawdzić. – partlov

Powiązane problemy