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