【问题标题】:<c:when> not working in PrimeFaces datatable?<c:when> 在 PrimeFaces 数据表中不起作用?
【发布时间】:2014-11-02 22:47:32
【问题描述】:

我要做的是对表格的第一行、第二行等做一些事情。

<p:panel header="#{mat.description}">
    <p:dataTable var="datarow" value="#{myBean.getDatarows(mat.itemId)}" emptyMessage="No materials" rowIndexVar="row">
        <c:choose>
            <c:when test="${row eq 0}">
                <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column>
            </c:when>
            <c:when test="${row eq 1}">
                <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column>
            </c:when>
        </c:choose>
        <p:column headerText=""><h:outputText value="#{datarow.get(6)}" /></p:column>
        <p:column headerText="Month 1"><h:outputText value="#{datarow.get(1)}" /></p:column>
        <p:column headerText="Month 3"><h:outputText value="#{datarow.get(2)}" /></p:column>
        <p:column headerText="Month4"><h:outputText value="#{datarow.get(3)}" /></p:column>
        <p:column headerText="Month 5"><h:outputText value="#{datarow.get(4)}" /></p:column>
        <p:column headerText="Month6"><h:outputText value="#{datarow.get(5)}" /></p:column>
    </p:dataTable>
</p:panel>

但是 c:choose 和 c:when 没有显示任何内容。我是否错误地测试了行号?

【问题讨论】:

标签: jsf primefaces jstl


【解决方案1】:

这是一个糟糕的设计,不会那样工作。您以错误的方式混淆了 JSTL 和 JSF 标记。

JSTL 标签c:choosec:when 在树构建期间评估,但p:dataTable 标签在呈现UI 树时评估。

如果您想包含/排除数据表的完整列,只需使用 p:column 上的 rendered 属性即可。如果您想实现在列显示的蜜蜂的不同行为,例如,您可以使用?-operator 来决定蜜蜂呈现的内容:

<p:dataTable var="datarow" ... rowIndexVar="row">
    <p:column>
        <h:outputText value="#{row eq 0 ? datarow.get(1) : 'some other stuff'}"/>
    </p:column>
</p:dataTable>

要在列中呈现不同类型的元素,只需将它们都放在列中,但使用不同的rendered-attribute:

<p:column>
        <h:outputText rendered="#{row != 4}"/>
        <p:inputText rendered="#{row eq 4}"/>
</p:column>

这将在第 5 行呈现一个输入元素(rowIndexVar 从 0 开始),并在所有其他行呈现一个输出元素。

【讨论】:

  • 谢谢。我发现我做得不对,但我的实际意图是让它成为仅一行的可编辑文本框,并在其他行上成为输出文本。我该怎么做?
  • @pern 我根据您在评论中的附加问题编辑了我的答案。
【解决方案2】:

我相信您总是需要相同数量的列。

将您的代码更改为:

<c:when test="${row eq 0}">
    <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column>
</c:when>
<c:when test="${row ne 0}">
    <p:column headerText=""><h:outputText value="#{datarow.get(1)}" /></p:column>
</c:when>

这样,当不在第一行或第二行时,您仍然拥有该列。

【讨论】:

  • 那么你应该在测试用例时添加更多......但你应该总是有一个匹配。
  • 这在概念上是错误的并且不起作用,您只是没有注意到它,因为您在每种情况下都呈现相同的内容。有关详细信息,请参阅下面的答案。
猜你喜欢
  • 2023-03-08
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 2011-03-22
  • 2013-09-24
  • 2013-10-17
  • 2013-03-10
相关资源
最近更新 更多