У меня есть составной компонент, представляющий элемент, который будет храниться в списке. Я хотел бы отобразить эти элементы с помощью <ui:repeat>
, но у меня проблемы с вызовами ajax. Дело в том, что для атрибута рендеринга <f:ajax>
я хочу передать id своего компонента через
#{cc.clientId}
Однако это вызывает ошибку, когда я использую его с <ui:repeat>
по причинам, которые объясняются в этом документе https://rogerkeays.com/jsf-c-foreach-vs-ui-repeat.
<cc:implementation>
<div id="#{cc.clientId}">
<h:form>
<h:commandLink styleClass="btn btn-info" value="Click me">
<f:ajax execute="@form"
render=":#{cc.clientId}"/>
</h:commandLink>
</h:form>
</div>
</cc:implementation>
Есть ли способ заставить вышеуказанный компонент работать, используя <ui:repeat>
(например, есть ли компонент, который может заменить обработчик тега <f:ajax>
, или мы застряли на конструкции <c:forEach>
)?
<ui:repeat id="myComponent" value="#{backingBean.myComponentItem}" var="item" varStatus="itemIndex">
<components:exampleComponent id="myComponent"/>
</ui:repeat>
Поэтому я начал использовать <c:forEach>
вместо <ui:repeat>
, и я смог использовать идентификатор моего компонента в атрибуте рендеринга <f:ajax>
. Но на этот раз, когда я разбиваю на страницы, если размер списка уменьшается, у меня появляются пустые компоненты на моей странице. Для решения этой проблемы я начал выполнять разбиение на страницы с помощью вызовов ajax, и это решило проблему с пустым компонентом.
Просто я думал, что все решено, я столкнулся с другой проблемой: скажем, у меня есть страница со списком 10 компонентов, и я перешел на другую страницу, и с этой страницы я снова пришел на страницу, отображающую компонент, но по какой-то причине, скажем, на этот раз я получил только 3 элемента из базы данных, и я просто хочу отобразить эти 3 элемента через свои компоненты, но ничего больше. К сожалению, в этом сценарии 3 элемента отображаются правильно, но страница также содержит 7 пустых компонентов. Для преодоления этого мне нужно перенаправить на эту страницу еще раз. Так что я просто сдался в этот момент. Помимо этого, я также в конечном итоге получаю исключение ниже, когда количество компонентов на странице изменяется.
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sun.faces.application.view.StateHolderSaver
Я попытался использовать предложение, объясненное в сообщении Jsf Error: java.lang.ClassCastException, но у меня это не сработало, я начал получать другую ошибку, аналогичную приведенному выше исключению.
<context-param>
<param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
<param-value>/pagename.xhtml</param-value>
</context-param>
Итак, после этих длинных объяснений я просто хотел бы узнать, как лучше всего создавать составные компоненты с поддержкой ajax, которые полностью несут ответственность за свои собственные состояния и независимы от других компонентов, и которые могут отображаться на странице. более одного раза, и количество компонентов может меняться в течение жизненного цикла страницы (через разбиение на страницы, навигацию и т. д.).