0

我有这样的:

<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 类似于 form:0:tbl,最后没有 idx。

当结果中只有一行时,重新渲染将起作用。

所以这里有一些问题:

  1. 为什么 dataTable 的 id 不能与 EL 表达式一起使用,而“first”属性却很好用?
  2. reRender 是如何工作的,即使我只是指定了 tbl,它仍然可以被解析,而实际的 HTML id 更长,比如 form:0:tbl?(如果我知道 reRender 是如何工作的,我也许可以破解它来使用 a4j:repeat...)
  3. 是否有任何技术或解决方法可用于仅刷新 a4j:repeat 中的特定数据表?

事实上,我已经成功地重新渲染了被 s:div 包围的整个 a4j:repeat 块。但是刷新整个块会重置滚动条,所以它是不需要的......

4

2 回答 2

0

好的最新实验表明,只需使用rich:dataTable id 即可。

要记住的关键:

  1. 在 a4j:repeat 中,dataTable 的 id 的绝对名称将具有类似 :0: :1: 的对应索引。
  2. 但是,要找到它,只需使用与 rich:dataTable 中定义的相同的 id 即可。不要在末尾附加任何后缀。
  3. 从 Chrome 观察 ajax 数据时,reRendered 部分就是组件的同一个相关数据表。

结论,想太多,一开始没有尝试最简单的解决方案。

于 2013-07-05T13:33:14.963 回答
0

对于 1,表的生命周期可能处于不同的阶段。

对于 2,它实际上是指 UIComponent.findComponent 用于查找给定 ID 的组件。

对于 3,或许可以尝试使用 UIComponent.findComponent() 或 #{rich:clientId('id')} 来查看是否要检索到 a4j:repeat 嵌入的rich:dataTable 的实际 HTML 元素 ID。

如果是,那么可以使 reRender 以某种方式工作。如果不是,请查看是否有任何东西可以覆盖 reRender 查找组件的方式。

于 2013-07-05T08:48:24.603 回答