f:渲染后执行的ajax监听器?

时间:2011-12-21 09:46:34

标签: java jsf mojarra

考虑以下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”。这基于:

  • docs.oracle.com/javaee/6/tutorial/doc/gkace.html:在生命周期的Invoke Application阶段调用一次侦听器的processAjaxBehavior方法
  • javaserverfaces.java.net/nonav/docs/2.0/pdldocs/facelets/:将参与请求处理生命周期的“呈现”部分的组件的标识符
  • www.ibm.com/developerworks/library/j-jsf2/:渲染确实是在调用后......

方法“#{taskManager.stopCurrentAtSpecified}”将在给定时间停止任务并将其设置为“null”,这意味着在重新渲染时评估“#{taskManager.currentTask!= null}”不再为真所以网格面板应该消失。不是这种情况。该任务确实已停止,但重新呈现的视图仍显示旧任务。刷新整个页面将正确呈现它。

另外我玩了“#{taskManager.changeStart}”,它会将“#{taskManager.currentStop}”更新为一个非常大的日期,所以你会怀疑是否执行了监听器并且之后执行了渲染,日历会反映这个大日期,但事实并非如此。

我找到了有类似问题的人,但他的问题没有得到答复:f:ajax with listener and render

我正在使用Mojarra 2.1.2

1 个答案:

答案 0 :(得分:1)

你可以尝试添加另一个始终可见的panelGroup并重新呈现吗?像

这样的东西
<h:panelGroup id="current">
  <h:panelGroup rendered="#{taskManager.currentTask != null}">
    ...
  </h:panelGroup>
</h:panelGroup>

部分更新会使用指定的ID替换元素的内容。我怀疑在更新元素本身未呈现时可能会出现问题。我希望在渲染阶段跳过它,结果不会产生更新。

如果你想避免额外的跨度,请使用ui:fragment或ui:component而不是嵌套的h:panelGroup。