【问题标题】:ui:repeat not working inside h:dataTableui:repeat 在 h:dataTable 中不起作用
【发布时间】:2014-04-24 22:54:52
【问题描述】:

h:dataTable 标签中的ui:repeat 有问题。我有一个带有字段名称的集合,另一个带有数据的集合。所以我通过索引匹配它们。当我加载页面时,抛出异常OutOfBoundsException。但是当我将filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField) 放在ui:repeat 之外时,它会显示正确的索引。所以我试图拆分它并将ui:paramc:set 声明为变量,但同样的问题。 cardDataactualCard 的属性不为空,也不为空,里面有 7 个项目,我已经调试过了。那么您知道可能是什么问题吗?

PS:当我将ui:repeat 更改为h:dataTable 时,它正在工作。最重要的是,在另一个 JSF 页面上使用了相同的结构并且它正在工作,只有一个区别 - 我从一个外部数据表中引用的卡中得到 cardData,所以它不是 Bean(dot) 属性等等, 但只有variable(dot) 等等。

有什么想法吗?谢谢您的帮助。 :)

<p:panel header="#{fileUploadBean.actualCard.id}">

        <h:dataTable value="#{filingCabinetManagerBean.filingCabinet.schema.fields}" var="schemaField" style="vertical-align: top">

            <h:column><h:outputText value="#{schemaField.fieldTitle}:" style="font-size: 20px;font-weight: bold"/></h:column>
            <h:column>
                <ul>
                    <ui:repeat value="#{fileUploadBean.actualCard.cardData.get(filingCabinetManagerBean.filingCabinet.schema.fields.indexOf(schemaField)).data}" var="data">
                        <li><h:outputText value="#{data.string}"/></li>
                    </ui:repeat>
                </ul>     
            </h:column>
        </h:dataTable>

【问题讨论】:

  • 哪个 JSF 实现/版本?最新尝试? 在 Mojarra 中有许多错误,其中大部分应该已经在当前最新的 2.2.12 中消除。当前答案仅显示解决方法而不是解决方案。尽管如此,在 getter 中执行业务逻辑是一个坏主意。您最好重新设计您的控制器以准确预填充视图期望的模型,而不是让视图通过 getter 填充模型(这显然是低效的)。另见 a.o. stackoverflow.com/questions/2090033/…

标签: jsf datatable uirepeat


【解决方案1】:

&lt;ui:repeat&gt;&lt;h:dataTable&gt; 中不起作用,因为&lt;ui:repeat&gt;value 是使用&lt;h:dataTable&gt;var 检索的。

由于一个模糊的原因,&lt;h:dataTable&gt; 正确地迭代列表中的所有对象加上最后一次使用null 值。最后一次迭代打破了&lt;ui:repeat&gt;

解决方案是在获取valueui:repeat 的同时处理此问题。例如,如果你有类似的东西:

<h:dataTable value="#{someBean.parentObjList}" var="obj">
  <h:column>
    <ui:repeat value="#{someBean.getChildren(obj)" var="child" >
       ...
    </ui:repeat>
  </h:column>
</h:dataTable>

在控制器中:

public List<ChildObj> getChildren(ParentObj obj) {
  return parentObjService.findAllFor(obj);
}

然后你需要替换它:

public List<ChildObj> getChildren(ParentObj obj) {
  if (obj == null)
    return new ArrayList<ChildObj>(); // return empty ArrayList to avoid crashing
  else 
    return parentObjService.findAllFor(obj);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-22
    • 2015-08-07
    • 2013-07-02
    • 2012-09-29
    • 2014-01-03
    • 2014-11-15
    相关资源
    最近更新 更多