Моя цель — динамически загружать содержимое компонента в JSF 2.0. Вариант использования таков: пользователь нажимает какую-то кнопку, которая открывает модальную панель с некоторым тяжелым содержимым через AJAX. Из-за его тяжести я хочу отложить загрузку до тех пор, пока/если это действительно понадобится пользователю. Если пользователь закрывает эту панель, она фактически не удаляется из DOM, а просто исчезает. Если пользователь снова нажимает кнопку инициализации, отображается ранее загруженная панель.
Я знаю, что могу предотвратить рендеринг содержимого с помощью rendered="#{cc.attrs.visibilityState == 'hidden'}" и что я могу повторно рендерить компонент с помощью вызова JSF AJAX. Однако как я могу настроить атрибуты составного компонента на лету, чтобы во второй раз компонент действительно визуализировался?
1) Я знаю, что я мог бы сделать:
<h:outputLink>Foo
<f:ajax event="click" render="theComponentIWantToUpdate" listener="#{someBean.someMethod()}" />
</h:outputLink>
А затем программно настроить атрибуты theComponentIWantToUpdate (чтобы изменить значение #{cc.attrs.visibilityState}), чтобы он действительно отображался с полным содержимым. Но как это сделать на самом деле?
2) Также проблема в том, что я не хочу обновлять (перерендерить) theComponentIWantToUpdate при каждом нажатии кнопки, только первый раз (см. бизнес-кейс). Как я могу установить оценку для <f:ajax /> вызова для этого? У него есть атрибут disabled, но он только указывает, действительно ли отображать AJAX-обработчик (не оценивается каждый раз при нажатии на ссылку).
3) Кроме того, я, вероятно, хочу сначала сделать какой-то собственный javascript при нажатии на ссылку и выполнить только запрос AJAX через javascript, используя jsf.ajax.request(). Однако эта функция не поддерживает предоставление атрибута listener, поэтому я не знаю, как выполнить метод резервного компонента с необработанным вызовом javascript jsf.ajax.request()? На самом деле есть аналогичный вопрос без подходящих ответов (см. only-rerender-an-area-of-page">JSF 2.0 AJAX: jsf.ajax.request для вызова метода не только для повторного рендеринга области страницы).