如何在jsf / a4j中重新呈现动态id(嵌套在datalist中)?

时间:2011-04-19 23:38:32

标签: java ajax jsf facelets ajax4jsf

使用jsf 1.1.11 / richfaces 3.1.5并在一个页面上有一个带有多个表的facelet(列表驱动表都存储在一个地图中),每个表都有自己的排序/分页,用于点击用户点击的ajax请求。 Bean是请求范围的。页面结构的形式如下:

<h:panelGroup id="allResults">
    <t:dataList id="keysItr" var="groupType" value="#{bean.tableKeys}">
        <t:dataList id="group" var="result" value="#{bean.groupResults[groupType].results}">
        ...table logic with sorting a4j commands
        </t:dataList>
        <h:panelGroup id="paginator">
        ... paginator logic from {bean.groupResults[groupType].paginator} with a4j commands
        </h:panelGroup>
    </t:dataList>
</h:panelGroup>

因此,如果我执行任何这些a4j命令并重新呈现allResults,它将适用于该特定表,但当然也会重置所有其他表的分页符/排序行为(返回到第1页的默认值, unsorted) - 我想重新渲染受用户点击影响的特定表,但表paginator和dataList id是动态的,因为它们嵌套在keysItr dataList中。

我写了一些javascript和a4j:jsfunction,它将抓取页面加载时表/ paginators的所有动态生成的键(因为它们只是形式_container1:_containerN:rowIndexVar:id所以很容易进行搜索然后把它扔进一个session-bean并尝试将这些id值放在a4j动作的reRender属性中,但是什么都没有激发,所以不要认为a4j允许id完全符合naming_containers和reRender属性的所有内容?

无论如何,只是想知道如果我已经知道id并且可以获取我想要的组件,那么可能会有某种方法强制在back bean中重新呈现特定的表/ paginator。我之前使用过一些代码,它们将从facescontext viewRoot以递归方式遍历子组件,以获取id引用的实际UIComponent,但之后不知道接下来要做什么以便重新发生。我可以采取任何想法或其他方法让这个工作?感谢。

1 个答案:

答案 0 :(得分:2)

由richfaces生成的组件的动态ID可以由#{rich:clientId('id')}访问。

例如,假设你有

<h:form id="form">
   < rich:dataTable id="table" > 
      ..............
   </rich:dataTable>
</h:form>

您可以在JSF页面中使用#{rich:clientId('table')}来访问表的动态ID,在此示例中将获得form:table

然后,您可以在a4j:command

中重新显示此表格

<a4j:commandButton .... reRender="#{rich:clientId('table')}"/>