Мотивация: я хочу уменьшить размер страницы при доступе, поэтому я подумал, что ленивый рендеринг на modalPanels поможет. Идея состоит в том, чтобы отображать modalPanel, когда пользователь щелкает ссылку, которая отображает его.
Я хочу лениво отображать rich:modalPanel
при нажатии ссылки для ее отображения. Для этого я нашел способ:
Код modalPanel
, заключенный в 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
, потому что reRendering непосредственно modalPanel не работает (я никогда не понимал, почему).После его рендеринга необходим дополнительный запрос, чтобы установить значение рендеринга в false (бин находится в пределах сеанса). В противном случае, если мы перезагрузим страницу, не будет никакого ленивого рендеринга, потому что значение было установлено на
true
.Компонент поддержки должен обрабатывать одно свойство, чтобы сохранить состояние для каждой modalPanel, хотя это свойство устанавливается в
true
всякий раз, когда нажимается ссылка, и устанавливается вfalse
по завершении запроса. Я пытался сохранить состояниеrendered
с переменными JS, но, похоже, это не работает (они просто считываются после загрузки страницы и никогда больше).
Есть ли более элегантный способ сделать это?