Повторная визуализация трюка «показать / скрыть» с помощью AJAX (JSF + richfaces) работает только для первой записи в a4j: repeat - PullRequest
1 голос
/ 18 сентября 2010

Некоторое время назад я работал над веб-проектом на основе JAVA и обнаружил, что этот веб-сайт очень полезен во многих случаях.
Итак, теперь у меня есть некоторые проблемы - и буду признателен, если вы поможете!

Хорошо, вот в чем дело -
Я пытаюсь отобразить список сообщений, каждое из которых состоит из заголовка сообщения и тела сообщения. Уловка, над которой я работаю, заключается в том, что тело сообщения, пока заголовок (который является a4j: commandLink) не был нажат, должно быть скрыто. И как только заголовок щелкнет - тело должно быть отображено. И как только его снова щелкнули - скрыть. И пр.
Вот что я сделал на стороне JSF (некоторые части для простоты опущены):

<a4j:repeat var="msg" value="#{ForumRenderJSF.messages}">
    <a4j:region id="msgAjaxRegion" renderRegionOnly="true">
    <a4j:outputPanel id="msgPanel" ajaxRendered="true">
    <rich:panel style="width: 100%; border: 0">
    <a4j:form id="msgForm">

        <!--
         The message's title.
         Each click results in either the revealing or hiding of the message's body.
         -->

        <a4j:commandLink value="#{msg.title}" action="#{ForumRenderAssistJSF.reevaluateRender}"/>
        <h:outputText value="  By: <i>#{msg.userNick}</i>,   #{msg.timestamp}" escape="false"/>

        <!--
         The message's body.
         -->

        <!-- A (textual) flag, indicating whether the body should be rendered. -->
        <h:inputText id="renderBodyFlag"/>

        <br/>
        <!-- The body. -->
        <a4j:outputPanel rendered="#{rich:findComponent('renderBodyFlag').value == true}">
            <h:outputText value="#{msg.body}"/>
        </a4j:outputPanel>

    </a4j:form>
    </rich:panel>
    </a4j:outputPanel> <!-- msgPanel -->
    </a4j:region>

</a4j:repeat>

Обратите внимание на использование:
1. Пустое поле renderFlag (должно быть, в конце концов, скрыто), значение которого указывает, следует ли отображать тело.
2. вспомогательный компонент для оказания помощи (ForumRenderAssistJSF); Его цель - перевернуть правильное значение renderFlag с «true» на «false» и наоборот.
3. Область a4j: для изоляции каждого сообщения при запуске запроса для ForumRenderAssistJSF.reevaluateRender () - так, чтобы компонент мог найти правильное поле «renderFlag».

Что касается бобов:

public class ForumRenderAssistJSF {
public void reevaluateRender()
    {
        FacesContext    context = FacesContext.getCurrentInstance();
        UIViewRoot      root = context.getViewRoot();
        UIComponent     renderFlagComp = (new UIComponentLookup()).lookup(root, compLookup); // My recursive search
        String          renderFlagVal = (String) ((HtmlInputText)renderFlagComp).getValue();

        if (!renderFlagVal.equals("true"))
        {
            ((HtmlInputText)renderFlagComp).setValue("true");
        }
        else
        {
            ((HtmlInputText)renderFlagComp).setValue("false");
        }
    }
}

И ПРОБЛЕМА ЕСТЬ:
Трюк действительно работает - но только для первого сообщения в списке! В остальном я вижу, что сервер может получить доступ к нужному компоненту ввода текста renderFlag (проверяется путем вставки значений на клиенте), но по какой-то причине - клиент всегда отображает его пустым (без содержимого) при ответе AJAX!

Я попытался покопаться в уроках и руководствах по richfaces, и мне кажется, что все так, как должно быть. Итак, я немного потерян здесь, и, как я уже сказал, буду очень признателен за вашу помощь в этом!

Спасибо!

1 Ответ

0 голосов
/ 20 сентября 2010

Вы пытались использовать rich: simpleTogglePanel ? Кажется, он предоставляет все необходимые вам функции.

...