我有一个复合组件,它表示将存储在列表中的项。我想使用<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>
的render属性中使用我的组件的id。但这一次当我进行分页时,如果列表的大小减小,我的页面中就会出现空组件。为了解决这个问题,我开始通过ajax调用进行分页,这解决了空组件的问题。
就在我以为一切都解决了的时候,我遇到了另一个问题:假设我有一个列出10个组件的页面,然后我转到另一个页面,从那个页面我又来到了组件显示页面,但出于某种原因,假设这次我只从数据库中检索了3个项目,我只想通过我的组件显示这3个项目。。不幸的是,在这种情况下,3个项目被正确显示,但页面也包含7个空组件。为了克服这一点,我需要再次重定向到此页面。所以我在这一点上放弃了。除此之外,当页面上组件的数量发生变化时,我最终也得到了下面的异常。
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.sun.faces.application.view.StateHolderSaver
我尝试使用Jsf错误帖子中解释的建议: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的复合组件的最佳方法是什么,这些组件完全负责自己的状态,独立于其他组件,并且可以在页面中多次显示,并且组件的数量在页面生命周期中可能会有所不同(通过分页、导航等)。
到目前为止,我想出的最好的解决方案是,检查页面中组件的数量,当这个数字通过ajax调用或由于从另一个页面进行导航而发生变化时,再次重定向到目标页面,这会刷新页面中的空组件,而不会对用户造成太大干扰。如果你有更好的解决方案,请告诉我们。