Ленивая загрузка частей шовных страниц?

Я работаю над шовным приложением (2.1.1.GA под JBoss AS 4.2.2), где у конкретного есть несколько (иногда больших) разделов, которые не нужно отображать, пока пользователь не взаимодействует с этим конкретным разделом, подумайте вдоль строк заголовка статьи, когда пользователь щелкает заголовок, и он расширяется, чтобы показать поле, содержащее текст.

Я могу без проблем реализовать это с Seam и Richfaces, но содержимое всех разделов загружается в браузер, когда пользователь впервые загружает страницу. Можно ли в любом случае загружать эти разделы (которые могут содержать или не содержать сами элементы управления Richfaces) по запросу с использованием ajax?

Спасибо.


person Nick Thomson    schedule 29.04.2009    source источник


Ответы (2)


Множество способов.

Просто установите rendered="false" в поле, а затем выполните повторную визуализацию родительского контейнера при нажатии на заголовок.

например. Где у вас есть логическое значение с именем showContent в вашем поддерживающем Bean-компоненте, которое переключается методом toggleContent():

<a4j:commandLink 
   value="This is a title" 
   ajaxSingle="true" 
   reRender="contentDiv" 
   action="#{someBackingBean.toggleContent}"/>

<a4j:outputPanel id="contentDiv">
   <a4j:outputPanel rendered="#{someBackingBean.showContent}">
      This is some text that is not rendered when the page loads
   </a4j:outputPanel>
</a4j:outputPanel>

РЕДАКТИРОВАТЬ: В ответ на комментарий. Другой способ сделать это — использовать a4j:jsFunction (очень удобно) и немного javascript.

<h1 onclick="toggleContent(this);">This is a title</h1>
<a4j:outputPanel id="contentDiv">
   <a4j:outputPanel rendered="#{someBackingBean.showContent}">
      This is some text that is not rendered when the page loads
   </a4j:outputPanel>
</a4j:outputPanel>

<script>
function toggleContent(element) {
   //check if the contentDiv has any contents (maybe check if element has a child under contentDiv)

   //if it doesn't then call a4j:jsFunction to load the contentDiv eg. loadContent();

   //hide or show div depending on the current state of it
}
</script>

<a4j:jsFunction name="loadContent" action="#{someBackingBean.toggleContent}" reRender="contentDiv"/>

Во всяком случае, что-то вроде этого.

person Damo    schedule 30.04.2009
comment
Это работает, но означает, что контент должен загружаться при каждом переключении. Это нормально для небольших разделов (которые, как правило, имеют элементы управления для нас, которые в любом случае должны быть полностью перерисованы), но может раздражать для больших. В идеале мы искали способ загрузить эти большие куски данных один раз. - person Nick Thomson; 01.05.2009
comment
a4j:jsFunction поможет. Я добавил очень грубый план того, как вы могли бы это сделать. - person Damo; 01.05.2009

А если вы используете прокручиваемую таблицу. Как реализовать выборку данных кусками?

Рагардс Марко

person Community    schedule 01.07.2009