2013-02-22 2 views
5

У меня есть JSF страницы facelet, как это (очень упрощенный вариант):Primefaces р: диалог не всегда появляется, если обновление = «DLG» в 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> 

Он отлично работает, пока я не положил dynamyc Заголовок в диалоге:

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

в какой момент я должен изменить атрибут update в p:commandButton:

update="@form :dlgEdit" 

Но в этом случае диалог будет отображаться только при первом нажатии кнопки. Он не появится во второй раз, а затем снова появится ...
Почему? Как я могу открыть диалог всегда?

Спасибо

+0

Какая версия PF это? попробуйте установить 'appendToBody =" true "' в вашем диалоговом окне. Также обратите внимание на разницу в состоянии DOM, когда в диалоговом окне отображается Vs, когда он не – kolossus

+0

Также обратите внимание на условие, при котором появляется диалоговое окно: OnSuccess. Что блокирует этот успех? – kolossus

+0

Я использую PrimeFaces 3.5. 'appendToBody' не влияет. Вызывается как 'oncomplete', так и' onsuccess' (я пытался с JS 'alert()'). Как я могу наблюдать за состоянием DOM? (извините за мое незнание ;-)) – yankee

ответ

11

oncomplete Используйте атрибут вместо атрибута onsuccess.

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

Атрибут onsuccess вызывается непосредственно, когда Ajax ответ успешно прибыл, но задолго до того, Аякса обновления выполняются на основе ответа Ajax. Атрибут oncomplete вызывается, когда обновления ajax успешно завершены. См. Также the tag documentation of <p:commandButton>.

В основном, это порядок вызова событий:

  • onclick обработчик вызывается
  • запрос Ajax подготовлен с данными формы на основе process
  • onbegin обработчик вызывается
  • запрос Ajax отправляется
  • ответ ajax успешно получен (код состояния HTTP равен 200)
  • onsuccess обработчик вызывается
  • Ajax обновления выполняются в HTML DOM на основе update
  • oncomplete обработчик вызывается
+0

Я бы просто добавил, что мое мнение таково, что 'dynamic =" true "' в этом примере не имеет никакого смысла, поскольку диалог уже полностью обновлен после запроса AJAX, поэтому в ответе AJAX будет весь диалог, и будет выполнен другой запрос AJAX, чтобы динамически загружать диалог. – partlov

+0

@partlov: Да, этот атрибут может быть опущен. Тем не менее, это полезно, если у вас относительно большой контент в диалоговом окне, и он не хочет сразу загружать его при первоначальном запросе, но только тогда, когда диалог открывается в первый раз. – BalusC

+0

Я точно не знаю, как работает Primefaces, но если динамический диалог полностью обновлен, возможно, это состояние «не загружено», поскольку оно изначально загружено.Таким образом, перезагрузка диалогового окна AJAX будет запущена снова? Возможно, я ошибаюсь, но я не в ситуации, чтобы проверить это прямо сейчас. – partlov

Смежные вопросы