ленивый рендеринг modalPanel при отображении

Мотивация: Я хочу уменьшить размер страницы, когда получен доступ, таким образом, я думал, что ленивый рендеринг на modalPanels поможет. Идея состоит в том, чтобы представить modalPanel, когда пользователь нажимает на ссылку, которая отображает его.

Я хочу к ленивому рендерингу на rich:modalPanel когда на ссылку для отображения его нажимают. Для достижения этого, я нашел путь:

Код modalPanel, перенесенный внутри a a4j:outputPanel

 <a4j:outputPanel id="a4jPanel">
  <rich:modalPanel id="panel" rendered="#{bean.renderPanel}">
         <!-- here modalPanel things -->
  </rich:modalPanel>
 </a4j:outputPanel>

Код отступающего боба (объем сессии):

   public boolean isRenderPanel() {
   return renderPanel;   //default value is false;
   }

    public void setRenderPanel(boolean value){
           this.renderPanel=value;
    }

    public setRenderFalse(){
           this.setRenderPanel(false);
    }

Код страницы, где это вызывается:

<a4j:form>
<a4j:jsFunction name="setRenderFalse" action="#{user.setRenderFalse}"/>
<a4j:commandLink value="render and show"  oncomplete="Richfaces.showModalPanel('panel');setRenderFalse();" reRender="a4jPanel">
<f:setPropertyActionListener target="#{user.renderPanel}" value="true" />
</a4j:commandLink>
</a4j:form>

Проблемы:

  • modalPanel должен быть перенесен в a4j:outputPanel потому что перерендеринг непосредственно modalPanel не работает (я никогда не понимал почему).

  • После рендеринга его дополнительный запрос необходим для устанавливания значения рендеринга ко лжи (боб является ограниченной по объему сессией). Иначе, если бы мы перезагружаем страницу не было бы никакого ленивого рендеринга, потому что значение было установлено к true.

  • Отступающий боб должен обработать одно свойство для хранения состояния для каждого modalPanel, хотя это свойство установлено на true каждый раз, когда на ссылку нажимают и устанавливают на false когда запрос закончен. Я попытался сохранить rendered состояние с переменными JS, но это, кажется, не работает (они просто читаются, после того как страница загружается и никогда снова).

Еще изящный способ сделать это?

7
задан pakore 7 July 2010 в 10:42
поделиться

2 ответа

Есть хорошее решение по вашему вопросу. Все, что нужно, - это способ обнаружения обратной передачи и пара xhtmls.

Прежде всего нам нужен bean-компонент, который поможет с указанием обратной передачи

public class HelperBean {

    public boolean isPostback() {
        FacesContext context = FacesContext.getCurrentInstance();
        return context.getRenderKit().getResponseStateManager().isPostback(context);
    }

}

empty.xhtml - для пустого содержимого

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jstl/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

</ui:composition>

modal.xhtml - для обертывания модального определения

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jstl/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

    <rich:modalPanel id="myLazyModal">
        <h:outputText value="Modal Content"/>
    </rich:modalPanel>
</ui:composition>

lazyModal.xhtml - для обработки включения вышеупомянутого xhtmls

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:c="http://java.sun.com/jstl/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

    <a4j:include id="lazyModal" layout="block"
        viewId="#{helperBean.postback ? 'modal.xhtml' : 'empty.xhtml'}"/>
</ui:composition>

, наконец, используйте его

   <h:form id="frmTest">
        <a4j:include id="lazyModalContainer" layout="block" viewId="lazyModal.xhtml"/>
        <a4j:commandButton id="btnSubmit" value="Submit" reRender="lazyModalContainer"
            oncomplete="Richfaces.showModalPanel('myLazyModal');"/>
   </h:form>

Теперь, когда страница загружена, пустой.xhtml будет включен до тех пор, пока не будет нажата кнопка btnSubmit .


Относительно проблем, о которых вы упомянули (1):

Повторный рендеринг компонентов с атрибутом rendered немного запутан. Когда визуализированное выражение оценивается как ложное, разметка не отправляется обратно клиенту. Следовательно, указание идентификатора компонента, не отображаемого в атрибуте reRender, никогда не будет работать, потому что такого идентификатора нет на стороне клиента (DOM).

7
ответ дан 7 December 2019 в 03:10
поделиться

Я думаю, вам нужно сделать отдельный xhtml (facelet) модальной панели и использовать ui:include, а затем по ссылке нажать на ссылку без необходимости булевого свойства.

enter code here : <ui:include src="modalPanel path">, <a4j:commandLink id="abclink" oncomplete="#{rich:component('yourPanelname')}.show()" reRender="yourPanelForm"/>
1
ответ дан 7 December 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: