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。该组件还具有selection
和select
属性,通常也可以使用。调用与 p:dataTable
相同的方法,并设置正确的 item。
但是,这真是一件令人讨厌的事情:如果我使用我的自定义组件,总是第一个单元格(第 0 列,第 0 行)中的值是 @ 987654328@。这些值取自 Map<Long,Map<Long,String>>
,我验证了特定 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 中的第一个条目错误)的主要内容,如果未能解决你的问题,请参考以下文章
PrimeFaces 3.0 - <p:dataTable> 标题不与使用 scrollable="true" 对齐