AJAX-события JSF2 не запускаются на динамически включаемых страницах - PullRequest
2 голосов
/ 02 августа 2011

У меня есть страница 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>

Вышеуказанное включение будет динамически получать имена страниц во время различных событий ajax, запускаемых на странице AdminHome.xhtml.

Ниже приведена одна из динамических страниц, которая загружается при изменении 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>  

Ответы [ 4 ]

1 голос
/ 19 октября 2011

Я заработал, изменив метод действия бина. Хитрость заключается в том, чтобы вернуться на ту же страницу, на которой запускается AJAX-запрос. Я использую PrimeFaces 2.2.1, и меню запускается Ajax-способом.

1 голос
/ 09 августа 2011

В JSF2 <ui:include> s оцениваются во время фазы просмотра восстановления, а не во время фазы ответа рендеринга.Поэтому они не работают динамически (больше).У меня была такая же проблема после перехода с JSF 1.2 на 2.1.

0 голосов
/ 10 апреля 2012

например. у вас есть <ui:include src="#{bean.value}", где bean - это bean области видимости.

Возможно все еще использовать динамическую загрузку страницы. Вы можете использовать любое из этих 2 решений:

  1. Установите для javax.faces.PARTIAL_STATE_SAVING значение false в web.xml для вашего проекта. Это запустит jsf1.2 способ сохранения состояния.

  2. Когда <ui:include/> оценивает значение - новый экземпляр компонента области видимости создается и не берется из контекста. В результате значение по умолчанию для src принято. Если вы поместите bean-компонент в область действия сеанса (что не очень хорошо) или создадите новый bean-компонент области действия, который будет содержать только строку пути к странице (чтобы минимизировать размер сеанса), это решит проблему.
    Вот еще один совет, если вы хотите сбросить значение этого сессионного компонента от перехода от страницы к странице. Один из способов - создать поддельный метод "reset()" и поставить <c:if test="#{bean.reset}"></if> перед <ui:include/>, чтобы выполнить инициализацию для вашей страницы. Сброс может выглядеть так:

    private String lastViewId;
    
    public boolean isReset() {
        String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();      
        if (!viewId.equals(lastViewId)) {
            lastViewId = viewId;
            //make any clean here
        }
        return false;
    }
    
0 голосов
/ 28 декабря 2011

Первая проблема, которую я вижу в вашем коде, заключается в том, что вы НЕ МОЖЕТЕ иметь 2 : одно вложено в другое. Я думаю, именно поэтому ваши события не проходят. У меня была такая же проблема в коде мая!

Кстати, BalusC, не могли бы вы объяснить, что вы сделали, «Хитрость заключается в том, чтобы вернуться на ту же страницу, на которой запускается запрос AJAX. Я использую PrimeFaces 2.2.1, и меню запускается AJAX» Мне не ясно,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...