a4j:outputPanel ReRender不起作用

时间:2011-07-14 17:41:37

标签: java jboss richfaces seam

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

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

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

<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.我做错了什么?

4 个答案:

答案 0 :(得分:4)

考虑RichFaces文档的这一点:

  

与大多数Ajax框架一样,您不应尝试追加或   使用RichFaces Ajax删除页面上的元素,但应该使用它   替换他们。因此,有条件地呈现的元素应该   不能成为Ajax控件的render属性的目标。对于   成功更新,一个具有相同标识符的元素   响应必须存在于页面上。如果有必要附加代码   一个页面,包含一个占位符(一个空元素)。

所以在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" [...] />

答案 1 :(得分:1)

rich:menuItem和s:link不是最好的朋友。 (特别是早期版本的RichFaces中没有。)

是否有特定原因要使用s:link here?

将action和reRender放在menuItem本身上应该可以正常工作。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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