1

一段时间以来,我一直在从事一个基于 JAVA 的 Web 项目,并且发现这个网站在很多场合都非常有用。
所以,'现在我自己也遇到了一些问题——如果你能帮忙的话,我会很感激的!

好的,事情就是这样——
我正在尝试呈现一个消息列表,每个消息都包含一个消息标题和一个消息正文。我正在研究的技巧是消息正文,只要标题(它是 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. 一个渲染辅助的backing bean(ForumRenderAssistJSF);它的目标是将正确的 renderFlag 值从“true”翻转为“false”,反之亦然。
3. 一个 a4j:region 在触发 ForumRenderAssistJSF.reevaluateRender() 请求时隔离每条消息——以便 bean 可以找到正确的“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 教程和手册,对我来说似乎一切都应该如此。所以,我有点迷失在这里,正如我所说 - 非常感谢你的帮助!

谢谢!

4

1 回答 1

0

您是否尝试过使用rich:simpleTogglePanel?它似乎提供了您需要的所有功能。

于 2010-09-20T08:37:36.847 回答