使用JSF 2 facelets迭代ListDataModel时访问上一个/下一个项<ui:repeat> tag </ui:repeat>

时间:2014-10-09 11:22:45

标签: jsf jsf-2 javabeans facelets uirepeat

我在列表上进行迭代,并希望当前元素的某些属性仅在它们与前一个元素不同时才呈现。现在我有:

<ui:repeat value="#{myBean.myListDataModel}" var="item" varStatus="itemStatus">

  <ui:fragment rendered="#{
      itemStatus.first 
      or (myBean.myListDataModelUnwrapped[itemStatus.index-1].category ne item.category)
  }">
      <h1>
          <h:outputText value="#{item.category}"/>
      </h1>
      <!-- can't open a ul here -->
  </ui:fragment>

          <li>
              <h:outputText value="#{item.name}"/>
          </li>

  <ui:fragment rendered="#{
      itemStatus.last or 
      (myBean.myListDataModelUnwrapped[itemStatus.index+1].category ne item.category)
  }">
      <!-- can't close a ul here -->
  </ui:fragment>

</ui:repeat>

,其中

Object[] myListDataModelUnwrapped = 
    (Object[]) ((new ArrayList((List) myListDataModel.getWrappedData())).toArray());
  • 在迭代ListDataModel时,访问上一个/下一个元素的更好方法是什么?

  • 如何在<ul></ul>代码上嵌入列表元素,在每个类别标题下方呈现有效的无序列表?

1 个答案:

答案 0 :(得分:1)

好吧,你有2个问题,我没有更好的解决方案。我一直用你的方式去做。

对于第二个问题,作为解决方法,您可以使用<ul></ul>打开和关闭h:outputText,如下所示:

xhtml代码:

<h:outputText value="#{testMB.ulStartTag}" escape="false"/>
...
<h:outputText value="#{testMB.ulEndTag}" escape="false"/>

托管bean代码:

public String getUlStartTag() {
    return "<ul>";
}

public String getUlEndTag() {
    return "</ul>";
}

ps:不要试图将"<ul>"作为h:outputText的值直接写入xhtml,它会在运行时失败,因为&#34;&lt;&#34;和&#34;&gt;&#34;字符。