【问题标题】:Composite component in ui:repeat vs c:forEach using ajax callsui:repeat 与 c:forEach 中的复合组件使用 ajax 调用
【发布时间】:2012-11-14 10:47:49
【问题描述】:

我有一个复合组件,它表示将存储在列表中的项目。我想使用<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>

有没有办法使用&lt;ui:repeat&gt; 使上述组件工作(例如,是否有可以替换&lt;f:ajax&gt; 标签处理程序的组件,或者我们是否坚持使用&lt;c:forEach&gt; 构造)?

<ui:repeat id="myComponent" value="#{backingBean.myComponentItem}" var="item" varStatus="itemIndex">
    <components:exampleComponent id="myComponent"/>
</ui:repeat>

所以我开始使用&lt;c:forEach&gt; 而不是&lt;ui:repeat&gt;,并且我能够在&lt;f:ajax&gt; 的渲染属性中使用我的组件的ID。但是这次当我进行分页时,如果列表的大小减小,我的页面中就会开始出现空组件。为了解决这个问题,我开始通过 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 的复合组件的最佳方法是什么,这些组件完全负责自己的状态并独立于其他组件,并且可以显示在页面不止一次,并且组件的数量在页面生命周期中可能会有所不同(通过分页、导航等)。

【问题讨论】:

  • BalusC 如果您不知道答案,我没有任何希望 =) 我正在尝试一些变通方法,例如如果页面中的组件数量从最后一个电话,这可能会救我,但肯定不是最优雅的解决方案=/
  • ui:重复状态保存在 Mojarra 中被严重破坏。它有几个非常严重的极端情况问题。你试过 MyFaces 吗?
  • 好吧,我根本不能使用 ui:repeat,因为如果通过 ui:repeat 创建了多个复合组件,则用于渲染 cc.clientId 的 ajax 调用会创建异常。

标签: jsf classcastexception composite-component uirepeat


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-02-04
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2013-06-29
    • 2011-04-02
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多