2012-11-26 44 views
2

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

#{cc.clientId} 

给我的组件的ID,当我用它来与<ui:repeat>,因为在本文件http://www.ninthavenue.com.au/blog/c:foreach-vs-ui:repeat-in-facelets中解释的原因然而,这引起了错误。

<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的复合材料部件,谁是全权负责自己的,国家的和独立的其它部件的最好的方法,那之后可以多次显示在页面中,并且页面生命周期期间(通过分页,导航等)组件的数量可能会有所不同。

+0

BalusC如果你不知道答案我没有任何希望=)我正在尝试一些工作,如重定向到同一页面,如果页面中的组件数量已从上次调用改变,这可能会救我,但肯定不是最优雅的解决方案=/ – cubbuk

+0

ui:重复状态保存在Mojarra严重破坏。它有几个非常严重的角落案例问题。你尝试过MyFaces吗? – BalusC

+0

嗯,我不能使用ui:因为如果通过ui创建多个复合组件:重复,ajax调用cc.clientId创建异常。 – cubbuk

回答

0

到目前为止,我想出的最佳解决方案是,检查页面中组件的数量,以及通过ajax调用或通过其他页面导航更改数字时,再次重定向到目标页面,这会刷新页面中的空白组件,而不会对用户造成太大干扰。如果您想出任何更好的解决方案,请告诉我们。