为什么JSF / AJAX会跳过阶段?

时间:2014-11-17 11:33:53

标签: ajax jsf jsf-2 commandbutton

我的页面有一个初始搜索/ h:数据表顶部。它渲染得很好并显示所有可用的文本单元(标记)。

使用按钮“view”引导搜索结果的每一行。此按钮会重新呈现面板组textUnitGroup,其中包含此令牌的详细信息。现在,这很好用。我可以单击所有令牌的视图按钮,刷新该区域而不重新加载页面。使用该面板组的输入字段(嵌入的表单),我还可以持久保存新标记。也是有效的。

但是,如果我将令牌详细信息加载到该详细信息表单中(表单再次呈现),并按下“保存文本”按钮,则跳过JSF阶段2,3,4和5(当我发生时,这不会发生保存一个新标记,之前没有点击“查看”按钮。)

12:31:44,174 INFO  [org.exadel.helper] (default task-22) L:54 BEFORE RESTORE_VIEW 1
12:31:44,180 INFO  [org.exadel.helper] (default task-22) L:67 AFTER RESTORE_VIEW 1
12:31:44,181 INFO  [org.exadel.helper] (default task-22) L:54 BEFORE RENDER_RESPONSE 6
12:31:44,257 INFO  [org.exadel.helper] (default task-22) L:67 AFTER RENDER_RESPONSE 6

重新呈现详细信息表格时会有一些变化。小组。但我不明白为什么。日志中没有错误。但它肯定是JSF阶段跳过的原因(否则插入新令牌也行不通。)

这是xhtml文件。如果您需要更多,请告诉我。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:mywidgets="http://java.sun.com/jsf/composite/widgets"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions"
    xmlns:pt="http://xmlns.jcp.org/jsf/passthrough">

<ui:composition template="/templates/overviewTemplate.xhtml">
    <!-- <ui:composition template="/templates/contentTemplate.xhtml"> -->

    <ui:define name="title">Text Administration</ui:define>

    <ui:define name="body">

        <h1>Text Administration</h1>

        <h:panelGroup layout="block" id="searchListGroup" rendered="true">

            <h:form id="listOfTextUnits">

                <h:inputText autocomplete="true" style="width: 300px"
                    value="#{textController.searchFilter}"
                    pt:placeholder="Token or text in English" pt:autofocus="true"
                    title="Search by token or text in English">
                    <f:ajax event="keyup" execute="@this" render="textTable" />
                </h:inputText>

                <p class="betweenSections" />

                <h:dataTable id="textTable"
                    value="#{textController.findTextUnitsByString()}" var="textUnit"
                    styleClass="data-table" headerClass="table-header"
                    rowClasses="table-odd-row,table-even-row">

                    <h:column>
                        <!-- column header -->
                        <f:facet name="header">Action</f:facet>
                        <!-- row record -->
                        <h:commandButton value="view" styleClass="mini"
                            action="#{textController.loadTextDetail()}">
                            <f:param name="id" value="#{textUnit.id}" />
                            <f:ajax execute="@form" render="textUnitGroup" />
                        </h:commandButton>
                    </h:column>

                    <h:column sortBy="#{textUnit.token}"
                        filterExpression="#{empty filterValue or fn:startsWith(textUnit.token, filterValue)}"
                        filterValue="#{textController.searchFilter}">
                        <f:facet name="header">Token</f:facet>
                        <h:outputText value="#{textUnit.token}" />
                    </h:column>

                    <h:column>
                        <!-- column header -->
                        <f:facet name="header">Default Text</f:facet>
                        <!-- row record -->
                        #{textUnit.defaultText}
                </h:column>

                </h:dataTable>

            </h:form>
        </h:panelGroup>

        <h:panelGroup layout="block" id="textUnitGroup"
            rendered="true">

            <h2>Text unit</h2>

            <h:form id="textUnit">
                <h:inputHidden id="id" value="#{textController.id}" />

                <label for="token">Token</label>
                <h:inputText id="token" value="#{textController.token}"
                    required="true"
                    requiredMessage="Please insert a token string for this new translation." />

                <label for="text">Default Text</label>
                <h:inputTextarea id="text" value="#{textController.text}"
                    required="true"
                    requiredMessage="Please insert a default text translation."
                    cols="100" />

                <h:commandButton value="save text"
                    action="#{textController.saveText()}">
                    <f:ajax execute="@form" render="searchListGroup" />
                </h:commandButton>

            </h:form>

        </h:panelGroup>

        <p class="betweenSections" />

    </ui:define>
</ui:composition>
</html>

感谢任何提示

-------------------------------- UPDATE -------------- -----------------

假设JavaScript代码出现问题,我确实将h:panelGroup放在h:form标记内。现在有效。这样做的缺点是,h2标签永远不会被重新呈现。这是我在下一步中想要的。隐藏表单,然后在需要时显示。

要正确地重新定义问题:如何重新呈现包含多个h:form whitout的小组,其中列出render标记的f:ajax属性中的所有表单?根本不可能?

感谢任何提示!

0 个答案:

没有答案