考虑以下jsf:
<h:panelGroup id="current" rendered="#{taskManager.currentTask != null}">
<table>
<tr>
<td><h:outputText value="#{taskManager.currentTask.title}" /></td>
<td>
<h:form>
<rich:calendar id="start"
popup="true"
datePattern="yyyy-MM-dd HH:mm:ss"
showApplyButton="true" cellWidth="24px"
cellHeight="22px" style="width:200px"
enableManualInput="true"
value="#{taskManager.currentStart}">
</rich:calendar>
<h:commandButton value="Update">
<f:ajax execute="@form" render=":current" listener="#{taskManager.changeStart}"/>
</h:commandButton>
<h:commandButton value="Stop">
<f:ajax render=":current" listener="#{taskManager.stopCurrent}"/>
</h:commandButton>
</h:form>
</td>
</tr>
<tr>
<td></td>
<td>
<h:form>
<rich:calendar id="stop"
popup="true"
datePattern="yyyy-MM-dd HH:mm:ss"
showApplyButton="true" cellWidth="24px"
cellHeight="22px" style="width:200px"
enableManualInput="true"
value="#{taskManager.currentStop}">
</rich:calendar>
<h:commandButton value="Stop At">
<f:ajax execute="@form" render=":current" listener="#{taskManager.stopCurrentAtSpecified}"/>
</h:commandButton>
</h:form>
</td>
</tr>
</table>
</h:panelGroup>
当我从文档中收集时,应该在重新呈现部分视图“:current”之前执行f:ajax标记中的“listener”。这基于:
方法“#{taskManager.stopCurrentAtSpecified}”将在给定时间停止任务并将其设置为“null”,这意味着在重新渲染时评估“#{taskManager.currentTask!= null}”不再为真所以网格面板应该消失。不是这种情况。该任务确实已停止,但重新呈现的视图仍显示旧任务。刷新整个页面将正确呈现它。
另外我玩了“#{taskManager.changeStart}”,它会将“#{taskManager.currentStop}”更新为一个非常大的日期,所以你会怀疑是否执行了监听器并且之后执行了渲染,日历会反映这个大日期,但事实并非如此。
我找到了有类似问题的人,但他的问题没有得到答复:f:ajax with listener and render
我正在使用Mojarra 2.1.2
答案 0 :(得分:1)
你可以尝试添加另一个始终可见的panelGroup并重新呈现吗?像
这样的东西<h:panelGroup id="current">
<h:panelGroup rendered="#{taskManager.currentTask != null}">
...
</h:panelGroup>
</h:panelGroup>
部分更新会使用指定的ID替换元素的内容。我怀疑在更新元素本身未呈现时可能会出现问题。我希望在渲染阶段跳过它,结果不会产生更新。
如果你想避免额外的跨度,请使用ui:fragment或ui:component而不是嵌套的h:panelGroup。