我有一个a4j:outputPanel,它基于一些布尔条件呈现:
<a4j:outputPanel id="someDisplayRegion" rendered="#{doc.ready && 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.
我做错了什么?
答案 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”必须返回可用于导航的字符串,但在我的情况下,页面会导航到自己(就像你的一样)。