2013-08-03 3 views
2

У меня есть страница xhtml, на которой отображается Datatable с записями. У меня также есть кнопка для вставки новой записи, которая отображает диалоговое окно с формой. Форма вставки используется как <ui:include> в родительском .xhtml следующим образом:Диалог PrimeFaces ссылается на родителя

Родитель файл Диалог файл

<h:form id="mainForm"> 
     <p:commandButton process="@form" update=":dlgGrp" oncomplete="dlg.show()"/> 

     <p:datatable id = "datatable"> 

      various columns 
      ..... 
      ..... 
     </p:datatable> 

    </h:form> 

    <p:dialog widgetVar="dlg" > 

     <h:panelGroup id="dlgGrp"> 
      <ui:include src="include.xhtml" /> 
     </h:panelGroup> 
    </p:dialog> 

</ui:composition> 

<ui:composition xmlns . . .> 

    <h:form id="subForm"> 

     various input fields 
     ...... 
     ...... 
     <p:commandButton process="@form" update=":mainForm" oncomplete="dlg.hide()"/> 

    </h:form> 

</ui:composition> 

Как я могу обратиться в общем смысле для родительского компонента, как показано в файл. В нескольких словах, как только я нажму кнопку отправки в диалоговом окне, я хочу обновить основную форму и скрыть диалог. Однако эти компоненты находятся в «родительском поле».

Это, вероятно, должно быть сделано программно через бэк-файл, так как я не хочу включать родительские действия в дочерний .xhtml, так как я тоже могу использовать его как автономный .xhtml.

+0

Вы можете рассмотреть возможность создания составного компонента из вашего включенного xhtml. Но мало информации о функциональности, чтобы дать вам дополнительные советы. – skuntsel

+1

Этот вопрос меня полностью смутил. Ответ, похоже, не соответствует тому, что задается (параметризуйте '', чтобы он был повторно использован для нескольких форм без изменения файла include), но ответ был принят! Теперь я не уверен, что конкретно вы спрашиваете. – BalusC

ответ

2

Если вы хотите обновить mainForm с помощью метода в backingBean. Просто измените

<p:commandButton process="@form" action="#{backingBean.method}" oncomplete="dlg.hide()"/> 

и в вашем backingBean сделать следующее (see Primefaces Showcase):

public void method() { 
    // do something 
    RequestContext context = RequestContext.getCurrentInstance(); 
    context.update(":mainForm"); 
} 

Вам просто нужно проверить, если ваш mainForm уже в другом NamingContainer. Если это так, вам необходимо соответственно изменить context.update(...).

Кроме того, если вы хотите обновить mainForm от вашего бэк-бэка, я бы также recomment скрывал диалог в backingBean, в зависимости от обрабатываемого ввода. Если, например, некоторые данные недействительны, вы не хотите скрывать диалог. Это невозможно сделать в настоящее время с вашим действием oncomplete, которое выполняется автоматически после получения ответа от сервера. Диалог будет близок, правильно ли введен вход.

Так добавить к method():

if (everythingWentFine) { 
    context.execute("dlg.hide();"); 
} 

и удалить oncomplete из вашего p:commandButton.

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