【问题标题】:JSF2 ajax events not triggered in dynamically included pagesJSF2 ajax 事件未在动态包含的页面中触发
【发布时间】:2011-10-18 12:26:21
【问题描述】:

我有一个 AdminHome.xhtml 页面,其中包含如下动态:

<h:form id="masterform">  
    <table class="DEFTABLE">                             
    <tbody>  
        <tr>  
            <td class="CREATESTYLE">Create    
            <h:selectOneMenu styleClass="SELECTBOX" id="createBox" value="#{adminWindowController.actionSelection}">  
            <f:ajax event="change" execute=":masterform:workspace" listener="#{adminWindowController.invokeAction}" render=":masterform:workspace :masterform:taskbar createBox"/>  
                <f:selectItem itemValue="NONE" itemLabel="Select one..."/>  
                <f:selectItem itemValue="CREATE_ENTITY_DEFINITION" itemLabel="Entity Definition"/>  
                <f:selectItem itemValue="CREATE_ENTITY_GROUP" itemLabel="Entity Group" />  
                <f:selectItem itemValue="CREATE_USER" itemLabel="User" />  
                <f:selectItem itemValue="CREATE_USER_GROUP" itemLabel="User Group" />  
            </h:selectOneMenu>  
            </td>  
        </tr>  
    </tbody>  
    </table>  

    <h:panelGroup id="workspace">  
    <table class="DEFTABLE">  
        <tr>  
            <td class="WSHEIGHT" valign="top">  
                <ui:include src="#{adminworkspace.workspaceContent}"/>  
            </td>  
        </tr>  
    </table>  
    </h:panelGroup>  
</h:form>

上述包含将在 AdminHome.xhtml 页面上触发的各种 ajax 事件期间动态获取页面名称。

下面是 selectOneMenu 更改时加载的动态页面之一。

<ui:composition>  
    <h:form id="entdefcreateform">  
    <h:panelGroup id="entdefpanel">  
        <table>  
        </table>  

        <table cellspacing="0">      
            <tr>  
            <ui:repeat value="#{adminEntityDefnController.entDefTabList}" var="tab">  
                <td class="#{tab == uIUtil.getRequestMapValue('activetab','General') ? 'TABBUTTONCTIVE' : 'TABBUTTON'} ">  
                    <h:commandLink action="#{adminWindowController.TabChange}" style="border: none;">  
                    <f:ajax execute=":masterform:entdefcreateform:entdefpanel" render=":masterform:entdefcreateform:entdefpanel"/>  
                        <f:param name="activetab" value="#{tab}"/>  
                        <h:outputText value="#{tab}"/>  
                    </h:commandLink>  
                </td>  
            </ui:repeat>  
            </tr>  
        </table>  
        <table class="TABCONTENTTABLE">  
            <tr valign="top">    
                <td class="TABCONTENT">  
                    <ui:include src= "#{adminEntityDefnController.entDefTabTable.get(uIUtil.getRequestMapValue('activetab','General'))}"/>  
                </td>  
            </tr>  
        </table>  
    </h:panelGroup>  
    </h:form>  
</ui:composition>  

【问题讨论】:

    标签: ajax jsf-2


    【解决方案1】:

    在 JSF2 中,&lt;ui:include&gt;s 在恢复视图阶段而不是在渲染响应阶段进行评估。因此,它们不再(不再)动态工作。从 JSF 1.2 迁移到 2.1 后,我遇到了同样的问题。

    【讨论】:

      【解决方案2】:

      我通过更改 bean 的操作方法使其工作。诀窍是返回到触发 ajax 请求的同一页面。我正在使用 PrimeFaces 2.2.1,菜单以 ajax 方式触发。

      【讨论】:

        【解决方案3】:

        我在您的代码中看到的第一个问题是您不能有 2 个

        :一个嵌套在另一个中。 我想这就是为什么您的事件不会触发的原因。 我在可能的代码中遇到了同样的问题!

        BTW BalusC 你能更准确地解释你做了什么吗 “诀窍是返回触发 ajax 请求的同一页面。我使用的是 PrimeFaces 2.2.1,菜单以 ajax 方式触发” 这对我来说不清楚

        【讨论】:

          【解决方案4】:

          例如你有&lt;ui:include src="#{bean.value}",其中 bean 是视图范围 bean。

          仍然可以使用动态页面加载。您可以使用以下两种解决方案中的任何一种:

          1. 为您的项目在web.xml 中将javax.faces.PARTIAL_STATE_SAVING 设置为false。会触发jsf1.2的状态保存方式。

          2. &lt;ui:include/&gt; 评估该值时 - 创建视图范围 bean 的新实例,而不是从上下文中获取。结果,src 采用了默认值。如果您将 bean 放在会话范围内(这不好)或创建仅包含您的页面路径字符串的新会话范围 bean(以最小化会话大小),它将解决问题。
            如果您想从页面到页面的导航重置此会话 bean 值,这里还有一个提示。其中一种方法是创建假方法“reset()”并将&lt;c:if test="#{bean.reset}"&gt;&lt;/if&gt; 放在&lt;ui:include/&gt; 之前,以便为您的页面进行此初始化。重置可能如下所示:

            private String lastViewId;
            
            public boolean isReset() {
                String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();      
                if (!viewId.equals(lastViewId)) {
                    lastViewId = viewId;
                    //make any clean here
                }
                return false;
            }
            

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-07
            • 2020-05-16
            • 2023-03-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多