Составной компонент в ui:repeat vs c:forEach с использованием вызовов ajax

У меня есть составной компонент, представляющий элемент, который будет храниться в списке. Я хотел бы отобразить эти элементы с помощью <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, которые полностью несут ответственность за свои собственные состояния и независимы от других компонентов, и которые могут отображаться на странице. более одного раза, и количество компонентов может меняться в течение жизненного цикла страницы (через разбиение на страницы, навигацию и т. д.).


person cubbuk    schedule 26.11.2012    source источник
comment
BalusC, если вы не знаете ответа, у меня нет никакой надежды =) Я пробую некоторые обходные пути, такие как перенаправление на ту же страницу, если количество компонентов на странице изменилось с момента последнего вызова, это может спасти меня но точно не самое изящное решение =/   -  person cubbuk    schedule 27.11.2012
comment
ui:repeat сохранение состояния серьезно нарушено в Mojarra. У него есть несколько довольно серьезных проблем с краеугольным камнем. Вы пробовали MyFaces?   -  person BalusC    schedule 30.11.2012
comment
Ну, я вообще не могу использовать ui:repeat, потому что, если через ui:repeat создано более одного составного компонента, вызовы ajax для рендеринга cc.clientId создают исключения.   -  person cubbuk    schedule 02.12.2012


Ответы (1)


На данный момент лучшее решение, которое я придумал, - это проверить количество компонентов на странице, и когда это число изменится с помощью вызова ajax или из-за навигации с другой страницы, перенаправить на целевую страницу еще раз, это обновит пустой компоненты на странице, не создавая особого беспокойства для пользователей. Если вы найдете лучшее решение, сообщите нам об этом.

person cubbuk    schedule 30.11.2012