【发布时间】:2013-08-16 14:04:38
【问题描述】:
我正在尝试让 h:textInput 在更改时重新呈现,我已尝试使用 a4j:ajax 和 f:ajax。
使用 a4j:ajax 时:
<h:panelGroup id="xyzPG">
<ui:repeat var="var" ... >
...
<h:inputText id="#{idController.getIdXYZ(var.id)}"
value="#{someModel.value}"
size="3"
styleClass="#{errorController.getErrorStateStyleId(idController.getIdXYZ())}">
<a4j:ajax event="change" render="xyzPG" listener="#{listener.doSomeStuff}" />
</h:inputText>
...
</ui:repeat>
</h:panelGroup>
这是第一次工作,在面板第一次更新后它停止更新模型并且侦听器也没有被调用。然而,渲染被触发,导致显示旧值。
现在,当我将 a4j:ajax 替换为 f:ajax 时,我收到错误消息,指出在 xyzInput 中找不到 id xyzPG。
<f:ajax event="change" render="@this" listener="#{listener.doSomeStuff}" />
当我尝试将重新渲染限制为 inputText 时,它总是会更新模型并调用侦听器,但是不会重新渲染 h:inputText。
我已经尝试在 inputText 周围放置另一个 panelGroup,但这也没有用。
我们不使用 h:dataTable 的原因是因为我们必须生成一个具有以下布局的 Table:
----------------------------
| dataSet1 | dataSet 2 |
----------------------------
| dataSet3 | dataSet 4 |
etc...
因此我们使用 ui:repeat 的 offset 和 step 属性。
【问题讨论】:
-
您是否尝试过其他事件,例如
blur、onkeyup等...? -
您对
id的动态使用让我的眼睛流血了。您可以使用以下答案避免与此相关的所有麻烦:stackoverflow.com/a/7312979/785663我认为您遇到了视图与渲染时间问题。没有c:repeat- 你有ui:repeat或c:forEach吗?如果是后者,另请参阅obligatory link -
wupps - 典型错误 - 正如您正确地指出它的 ui:repeat 这就是当您编写代码而不是复制原始代码时会发生的情况。关于动态 id - 我也不太满意,但由于项目特定的限制,这个决定是由项目架构师做出的,所以我们坚持这样做。
-
我已经添加了关于我们为什么使用 ui:repeat 的解释