JSF p:dataTable 的奇怪行为(p:columns 中的第一个条目错误)

Posted

技术标签:

【中文标题】JSF p:dataTable 的奇怪行为(p:columns 中的第一个条目错误)【英文标题】:Weird behavior of JSF p:dataTable (first entry wrong in p:columns) 【发布时间】:2013-02-20 21:51:43 【问题描述】:

我在第二页上有p:dataTable。左边主要用于选择

<p:dataTable id="leftTable" var="item" value="#bean.items"
             selection="#bean.item" selectionMode="single">
  <p:ajax event="rowSelect" update=":rightTable" listener="#bean.select"/>  
  <p:column>
    <h:outputText value="#item.value" />  
  </p:column>
</p:dataTable>

这相当简单并且工作正常。 rightTable 比较复杂,这是一个简化的例子:

<p:dataTable id="rightTable" var="row" value="#bean.rows">
  <p:columns var="col" value="#bean.cols">  
    <h:outputText value="#bean.map[row.id][col.id]"/>
  </p:columns>
</p:dataTable>

嗯,这也很好用。现在我实现了一个composite component 来替换leftTable。该组件还具有selectionselect 属性,通常也可以使用。调用与 p:dataTable 相同的方法,并设置正确的 item

但是,这真是一件令人讨厌的事情:如果我使用我的自定义组件,总是第一个单元格(第 0 列,第 0 行)中的值是 @ 987654328@。这些值取自 Map&lt;Long,Map&lt;Long,String&gt;&gt;,我验证了特定 row.id,col.id 的值是在调用该方法后设置的。

我对这个问题一无所知,并希望回答这个问题真的很难,如果有人能帮助我更详细地调试这个问题,我真的很感激。

更新 1: 根据要求,我检查了#row.id,#col.id

95,626 | 95,528
96,527 | 96,528
97,527 | 97,528

在第一个单元格中,col.id 是错误的。它应该是527,但实际上是626(它是上一个请求的值)。为什么会这样?如何获得正确的值?

更新 2:这是我的组件:

<composite:interface componentType="my.MenuDmClick">
  <composite:attribute name="actionListener" required="true"
        method-signature="void listener(javax.faces.event.AjaxBehaviorEvent)"/>
  <composite:attribute name="selection"/>
  <composite:attribute name="update/>
  <composite:attribute name="dm"/>
</composite:interface>
<composite:implementation>
  <ui:repeat var="item" value="#cc.attrs.dm.wrappedData">
  <li>
    <p:commandLink actionListener="#cc.actionListener(item)"
                   update="#cc.attrs.update">
      <h:outputText value="#item.name"/>
    </p:commandLink>
  </li>
  </ui:repeat>
</composite:implementation>

这是支持 bean:

@FacesComponent(value="my.MenuDmClick")
public class MenuDmClick extends UINamingContainer

  public void actionListener(Object ejb)
  
    FacesContext context = FacesContext.getCurrentInstance();
    ValueExpression mSelection = this.getValueExpression("selection");

    if(mSelection!=null)mSelection.setValue(context.getELContext(), ejb);
    elsethrow new PropertyNotFoundException("'selection' must be a ValueExpression!");

    MethodExpression ajaxEventListener =
         (MethodExpression) getAttributes().get("actionListener");
    ajaxEventListener.invoke(context.getELContext(), new Object[] );
  

【问题讨论】:

当您使用可选的dataTable 时,您应该为模型bean 的某些独特属性提供rowKey,例如它可以是rowKey="#item.value"。试试这个,看看发生了什么。 使用可选的dataTable 我没有问题。它发生在我使用自己的复合材料:组件时。使用的 id (long) 是唯一的。 h:outputText 附近添加#row.id,#col.id 的打印,看看是否符合预期的值。 很好的建议。我已经这样做了(请参阅更新的问题)。第一行的 col.id 是错误的......无论如何...... 这看起来确实是问题出在托管 bean bean 中,它包含了这些值。 【参考方案1】:

在尝试了通常的东西之后

ui:repeat 和 c:forEach 立即=真/假

我遇到了process=@this ...它就像一个魅力!

<c:forEach var="item" items="#cc.attrs.dm.wrappedData">
  <li>
    <p:commandLink process="@this"
        actionListener="#cc.actionListener(item)" update="#cc.attrs.update">
      <h:outputText value="#item.round.name"/>
    </p:commandLink>
  </li>
</c:forEach>

【讨论】:

以上是关于JSF p:dataTable 的奇怪行为(p:columns 中的第一个条目错误)的主要内容,如果未能解决你的问题,请参考以下文章

p:datatable rowkey 没有用 var 解析

PrimeFaces 3.0 - <p:dataTable> 标题不与使用 scrollable="true" 对齐

JSF h:form 标签到底是啥

JSF2 + Eclipse + Glassfish 奇怪的输出问题

允许在第一次通过时选择 JSF 输入文本,光标位置

在 JSF 数据表中显示来自 MySQL 数据库的图像 [关闭]