我有这样的东西:
<a4j:repeat value="#{results}" var="hdr" rowKeyVar="idx">
<rich:dataTable var="item" value="#{results}" id="tbl#{idx}" first="#{idx}" rows="1">
<a4j:commandButton value="update this table only" reRender="tbl#{idx}" />
</rich:dataTable>
</a4j:repeat>
当我从输出html进行检查时,数据表具有类似id的表单:0:tbl,其末尾没有idx。
当结果中只有一行时,reRender将起作用。
因此,以下是一些问题:
- 为什么dataTable的id不能与EL表达式一起工作,而"first"属性却能很好地工作
- reRender是如何工作的,即使我只指定tbl,它仍然可以被解析,而实际的HTML id是类似于0:tbl的格式?(如果我知道reRender是如何工作的,我也许可以破解它来使用a4j:重复…)
- 有没有什么技术或解决方法可以用来只刷新a4j:repeat中的特定数据表
事实上,我已经成功地重新渲染了被s:div包围的整个a4j:repeat块。但是刷新整个块会重置滚动条,所以这是不需要的。。。。
对于1,表的生命周期可能处于不同的阶段。
对于2,它指的是UIComponent.findComponent事实上用于查找给定ID的组件。
对于3,可以尝试使用UIComponent.findComponent()或#{rich:clientId('id')}来查看是否要检索a4j:repeat嵌入式rich:dataTable的实际HTML元素id。
如果是,那么可以以某种方式重新渲染。如果没有,请查看是否有任何内容可以覆盖reRender查找组件的方式。
好的,最新的实验表明,简单地使用rich:dataTable-id就可以了
要记住的关键:
- 在a4j:repeat中,dataTable的id的绝对名称对于相应的索引将具有类似于:0::1:的内容
- 然而,要找到它,只需使用rich:dataTable中定义的相同id即可。不要在末尾附加任何后缀
- 当观察Chrome中的ajax数据时,reRendered部分与组件的相关dataTable完全相同
结语,想多了,一开始没能尝试最简单的解决方案。