2

我有一个复合组件,它表示将存储在列表中的项目。我想使用 显示这些项目<ui:repeat>,但在进行 ajax 调用时遇到问题。问题是对于<f:ajax>渲染属性,我想通过

#{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>,并且我能够在 的渲染属性中使用我的组件的 id <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 的复合组件的最佳方法是什么,他们完全负责自己的状态并独立于其他组件,并且可以在页面中显示更多不止一次,并且组件的数量在页面生命周期中可能会有所不同(通过分页、导航等)。

4

1 回答 1

0

So far the best solution I came up with is, to check number of components in the page and when that number changes through an ajax call or because of a navigation from another page, redirect to the destination page one more time, this refreshes the empty components in the page without creating much disturbance to users. If you come up with any better solution please let us know.

于 2012-11-30T18:23:47.777 回答