Загрузка данных после завершения рендеринга страницы JSF

Я использую Richfaces 4 и Mojarra 2.0.4. Так что буду рад, если ответ будет специфичен для фреймворка Richfaces 4 :)

Я понимаю, что компоненты JSF обрабатываются на стороне сервера. Некоторые из моих страниц действительно ориентированы на данные. Поэтому, когда я загружаю эту страницу (например: внутри richTab с switchType ajax), моему bean-компоненту требуется много времени для выполнения метода, отмеченного @PostConstruct, для выполнения и выборки данных. И, следовательно, период времени между нажатием пользователем на заголовок вкладки и фактическим рендерингом страницы довольно велик, что очень плохо для пользователя. Я реализовал ленивую загрузку для таблиц данных на странице, но это все еще не оптимизирует время загрузки моей страницы, поскольку @PostConstruct все еще существует.

Могу ли я сначала загрузить страницу, а ЗАТЕМ получить данные с помощью ajax и обновить страницу? Это время загрузки действительно раздражает пользователя. Любая помощь приветствуется :)

PS: я подумал об использовании событий oncomplete и onbeforedomupdate на стороне клиента rich:tab и вызове функций ajax, объявленных с помощью a4j:function. Но кажется, что эти события запускаются до фактического переключения страницы.


person Niks    schedule 29.04.2011    source источник


Ответы (1)


используйте событие onload тега <body> в html вместе с <a4j:jsFunction>

Если вы все еще чувствуете, что ваша страница не отображается полностью до вызова метода, используйте функцию setTimeout('a4jfunctionName',10) javascript в onload, чтобы сначала завершить рендеринг.

person niksvp    schedule 29.04.2011
comment
Спасибо за ответ! Однако, если мы будем использовать событие onload, мне придется проверить, какой метод bean-компонента вызывать, в зависимости от того, какая вкладка загружена. Верно? Но ваш ответ только что дал мне идею! Я мог бы использовать oncomplete для rich:tab вместе с setTimeout! Постараюсь вернуться. :) - person Niks; 29.04.2011
comment
@Nikhil - да, это правда, иначе вам придется загружать все данные одновременно, удачи :) - person niksvp; 29.04.2011
comment
Ну, только что обнаружил, что метод oncomplete первой вкладки не выполняется! если я переключусь на другую вкладку и вернусь к первой, только тогда будет выполнено завершение первой вкладки. Поэтому я не могу использовать эту стратегию для первой вкладки. :| - person Niks; 29.04.2011
comment
Наконец-то смог получить. Вызывается a4j:jsFunction в $(document).ready этой конкретной страницы. Например: если моя первая вкладка загружает страницу tab1.xhtml, тогда поместите вызов loadTab1() в $(document).ready, определенный в tab1.xhtml. Не пришлось использовать задержку:) - person Niks; 29.04.2011
comment
@Nikhil- да, это лучшая стратегия, если вы использовали jQuery, то же самое вы могли бы сделать с событием onload. - person niksvp; 29.04.2011