渲染组件后,如何将请求映射中的对象传递到方法表达式中?
How do I pass objects from the request map into a method expression after rendering a component?
我正在编写一个自定义数据表组件,我正试图让其他开发人员使用当前迭代的 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>
如您所见,我正在尝试将 "contact" 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/ICEFaces 的数据表,但我看不出它们与我的有何不同
提前致谢!
所以,我终于解决了这个问题!扩展 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 ++;
}
我正在编写一个自定义数据表组件,我正试图让其他开发人员使用当前迭代的 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>
如您所见,我正在尝试将 "contact" 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/ICEFaces 的数据表,但我看不出它们与我的有何不同
提前致谢!
所以,我终于解决了这个问题!扩展 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 ++;
}