我正在编写自定义数据表组件,并且我试图允许其他开发人员使用当前迭代的var传递给方法表达式。
以下是一个例子:
<my:dataTable value="#{contactController.viewEntities}" var="contact">
<p:column headerText="Whatever">
<p:commandButton value="Edit"
ajax="false"
actionListener="#{contactController.setSelectedContact(contact)}"
action="contact"/>
</p:column>
</my:dataTable>
正如您所看到的,我正试图通过&#34;联系人&#34; var成为一个setter方法供以后使用。该var在渲染过程中存储在请求图中,如下所示:
...
Map<String, Object> requestMap = context.getExternalContext()
.getRequestMap();
for (Object obj : collection) {
requestMap.put(table.getVar(), obj);
for (UIColumn column : columns) {
column.encodeAll(context);
}
requestMap.remove(table.getVar());
}
...
但是,当我运行项目时,传递给控制器的唯一值为null。
问题变成了,如何使该对象可用于表达式语言中使用的每一行?我看过PrimeFaces&#39; / ICEFaces&#39;数据表,但我不知道它们与我的不同
提前致谢!
答案 0 :(得分:0)
所以,我终于解决了这个问题!扩展UIData时,方法setRowIndex(index)
变为可用。通过设置此值,每行的组件的clientId
将添加索引号,从而使每行唯一。诀窍是在迭代底层集合时设置此值。表达式语言现在可以评估var参数。
int index = 0;
Map<String, Object> requestMap = context.getExternalContext()
.getRequestMap();
for (Object obj : collection) {
requestMap.put(table.getVar(), obj);
table.setRowIndex(index);
for (UIColumn column : columns) {
column.encodeAll(context);
}
requestMap.remove(table.getVar());
index ++;
}