【问题标题】:a4j: outputPanel ReRender does not worka4j:输出面板重新渲染不起作用
【发布时间】:2011-07-14 17:41:37
【问题描述】:

我有一个基于一些布尔条件呈现的 a4j:outputPanel:

<a4j:outputPanel id="someDisplayRegion" rendered="#{doc.ready &amp;&amp someClass.someBooleanMethod}"> 
    // bunch of stuff //
</a4j:outputPanel>

然后在同一个 .xhtml 页面上,我有一个下拉菜单,选择其中一个选项应该重新渲染上述区域:

<rich:dropDownMenu>                                         
    <f:facet name="label">                                            
        <a4j:commandLink styleClass="btn-pulldown">                                             
            <span><h:outputText value="Export"></h:outputText></span>                                                       
            <span class="opener"></span>                                              
        </a4j:commandLink>                                        
    </f:facet>                                              

    <rich:menuItem  submitMode="none">                                                 
        <s:link                                                 
            rendered="#{someOtherBooleanMethod}"                                    
            value="#exportDoc"                                              
            action="#{runSomething.exportDoc()}"                                                
            reRender="someDisplayRegion"                                                
            target="downloadfile"                                                
       ><s:conversationId /></s:link>                                          
    </rich:menuItem>                                                                                 
</rich:dropDownMenu>

但是,当我从下拉菜单中单击菜单项时,它不会进入someClass.someBooleanMethod,因此不会重新渲染someDisplayRegion. 我做错了什么吗?

【问题讨论】:

    标签: java jboss richfaces seam


    【解决方案1】:

    考虑一下 RichFaces 文档的这一点:

    与大多数 Ajax 框架一样,您不应尝试追加或 使用 RichFaces Ajax 删除页面上的元素,但应该改为 替换它们。因此,有条件渲染的元素应该 不能在 Ajax 控件的呈现属性中定位。为了 成功更新,一个与 响应必须存在于页面上。如果需要将代码附加到 一个页面,为其包含一个占位符(一个空元素)。

    因此,在您的 outputPanel 周围添加一个包装器,并在 reRender 属性中定位包装器。

    <a4j:outputPanel id="wrapper">
        <a4j:outputPanel id="someDisplayRegion" rendered="#{doc.ready && someClass.someBooleanMethod}"> 
            // bunch of stuff //
        </a4j:outputPanel>
    </a4j:outputPanel>
    
    
    <s:link reRender="wrapper" [...] />
    

    【讨论】:

      【解决方案2】:

      s:link 没有 reRender 属性,它只在 RichFaces 组件上可用。

      【讨论】:

      • 这就是问题所在。我最终使用了 onmouseup,效果很好!
      【解决方案3】:

      rich:menuItem 和 s:link 不是最好的朋友。 (尤其是在早期版本的 RichFaces 中)。

      您想在此处使用 s:link 是否有特定原因?

      将操作和重新渲染放在 menuItem 本身应该可以正常工作。

      【讨论】:

      • action 属性执行一个动作并返回 void 或字符串(导航结果)。someBooleanMethod 指的是我猜的渲染属性。
      • someBooleanMethod 返回真或假。问题是,我已经在菜单项中调用了一个动作。我不能有两个动作,对吧?
      【解决方案4】:

      我不明白为什么您认为单击菜单项应该进入 someClass.someBooleanMethod 而不是 runSomething.exportDoc()。在什么时候 doc.ready 和 someClass.someBooleanMethod 被设置为 true?你可以在你的代码中加入一个调试语句来验证这些设置是否为真。如果它们设置为 true 并且您的 a4j:outputPanel 仍然没有呈现 那么 你就有问题了。我在这里使用 s:link 并且它可以工作,但我记得不得不摆弄它。确保在 s:link 中触发的操作返回一个字符串。 “动作”必须返回可用于导航的字符串,尽管在我的情况下页面导航到自身(就像你的一样)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 2011-07-27
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多