2013-04-10 5 views
0

Я использую PrimeFaces 3.5, и у меня возникла проблема с частичным отображением страницы. Мне нужно загрузить контент из файла Facelet в «динамическую» часть шаблона.частичный рендеринг страниц (PPR) с face-redirect

index.xhtml:

<f:view> 
    <h:form id="form1"> 
     <p:outputPanel layout="block"> 
      <p:commandButton action="content-2?faces-redirect=false" update="display" /> 
     </p:outputPanel> 
     <p:outputPanel id="display" layout="block"> 
      content 1 
     </p:outputPanel> 
    </h:form> 
</f:view> 

content-2.xhtml:

<h:body> 
    content 2 loaded 
</h:body> 

Когда я нажимаю на <p:commandButton>, то будет открыт content-2.xhtml. Однако это обновляет всю страницу. Ответ XML содержит, как это:

<partial-response><changes><update id="javax.faces.ViewRoot"> 

Когда я изменить атрибут action к выражению метода:

<f:view> 
    <h:form id="form1"> 
     <p:outputPanel layout="block"> 
      <p:commandButton action="#{myBean.increment}" update="display" /> 
     </p:outputPanel> 
     <p:outputPanel id="display" layout="block"> 
      #{myBean.count} 
     </p:outputPanel> 
    </h:form> 
</f:view> 

Тогда display обновления блока, как ожидалось. Ответ XML содержит, как это:

<partial-response><changes><update id="form:display"> 

Почему обновить action="content-2?faces-redirect=false" путь всей страницы?

Я также пытался использовать <ui:composition>, но в этом случае это перезагружает «статическую» часть шаблона. Я не хочу этого.

+0

Вы подразумеваете, что '# {myBean.method}' возвращает 'content-2.xhtml'? «Faces-redirect = false» уже по умолчанию, я не понимаю, почему вы прямо упоминаете об этом. Вы подразумеваете, что 'action =" content-2.xhtml "' ведет себя по-другому? – BalusC

+0

Нет, извините, я обновил часть, которая с # {myBean.method}. Тело метода выглядит как 'count ++'. И я попробую 'action =" content-2.xhtml "' его также обновить 'javax.faces.ViewRoot', но' action = "# {myBean.increment}" 'refresh' display'. Я думал, что 'faces-redirect = false' должно иметь назначение' true' или 'false'. – Mrusful

ответ

0

Это вполне нормально и ожидаемое поведение, если вы навигации на другую точку зрения путем подачи не- null результата в атрибуте action. Затем JSF отменит частичный рендер рендером @all. JSF/Facelets не смогут каким-то образом сохранить общие компоненты в дереве, как вы ожидали. Если вы собираетесь динамически изменение дерева компонентов в процессе визуализации частичной страницы, то вам нужно внутри <p:outputPanel id="display" layout="block"> либо динамические включать что-то вроде этого (section только целое число)

<ui:include src="section#{bean.section}.xhtml" /> 

или несколько условно оказанные разделов

<ui:fragment rendered="#{bean.section == 1}"><ui:include src="section1.xhtml" /></ui:fragment> 
<ui:fragment rendered="#{bean.section == 2}"><ui:include src="section2.xhtml" /></ui:fragment> 
<ui:fragment rendered="#{bean.section == 3}"><ui:include src="section3.xhtml" /></ui:fragment> 
<ui:fragment rendered="#{bean.section == 4}"><ui:include src="section4.xhtml" /></ui:fragment> 

У каждого есть свои плюсы и минусы, зависящие от того, содержит ли включенный файл компоненты формы/ввода/команды и/или ссылки на область видимых бобов. <ui:include> работает именно во время времени просмотра, например, JSTL. См. Также более подробную информацию JSTL in JSF2 Facelets... makes sense?

Наличие faces-redirect=false не имеет значения, поскольку оно по умолчанию уже выполнено. Если это было true, тогда на целевой URL-адрес будет вызываться JavaScript window.location.

+0

Спасибо, думаю, я понимаю сейчас.Я подумал, как я могу сделать так, что все блоки на странице могут обновляться независимо от состояния сервера. – Mrusful

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