在渲染组件后,如何将请求映射中的对象传递给方法表达式?

时间:2015-01-19 15:50:38

标签: jsf custom-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>

正如您所看到的,我正试图通过&#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;数据表,但我不知道它们与我的不同

提前致谢!

1 个答案:

答案 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 ++;
}