我有一个 Facelets 子视图,它为客户端/subviews/document-tree.xhtml
上的每个选项卡呈现一棵树<rich:tabPanel>
。页面和子视图基于 JSF 2 和 RichFaces 4。
<ui:composition ...>
<rich:tree value="#{rootNode}" var="treeNode" id="#{treeId}">
<rich:treeNode ... id="chapternode">
<h:panelGrid columns="2">
<rich:outputText value="#{treeNode.name}" />
<h:commandLink>
<h:graphicImage library="images/icons" name="delete.png" />
<rich:componentControl target="remove-chapter-popup" operation="show" />
</h:commandLink>
<rich:popupPanel modal="true"
onmaskclick="#{rich:component('remove-chapter-popup')}.hide(); return false;"
id="remove-chapter-popup">
<f:facet name="header">
<h:outputText value="Remove chapter?" />
</f:facet>
<f:facet name="controls">
<h:outputText value="X" />
</f:facet>
<p>Remove chapter #{treeNode.name}?</p>
<h:panelGrid columns="2">
<h:commandButton value="Add"
action="#{nodeManager.removeChapterNode(treeNode)}"
onclick="#{rich:component('remove-chapter-popup')}.hide(); return true;">
<!--f:ajax execute="@this" render="@form" /--> <!-- never executed! -->
<a4j:ajax execute="@this" render="@form" /> <!-- this works however! -->
</h:commandButton>
<h:commandButton value="Cancel"
onclick="#{rich:component('remove-chapter-popup')}.hide(); return false;" immediate="true" />
</h:panelGrid>
</rich:popupPanel>
</h:panelGrid>
</rich:treeNode>
...
</rich:tree>
</ui:composition>
这基本上显示了带有名称的树节点以及右侧的图像以供删除。
每个树子视图都放置在一个<rich:tab>
中,因此选项卡面板确实具有所需的封闭<h:form>
。没有其他嵌套形式(无论如何禁止)。
bean被#{nodeManager.removeChapterNode(treeNode)}
正确标记为@ViewScoped
.
现在发生的事情有点奇怪:
使用<f:ajax execute="@this" ... />
按钮时永远不会执行,而使用<a4j:ajax execute="@this" ... />
总是有效。
为什么?这里有什么问题?
考虑到 RichFaces根据他们自己的话<a4j:ajax>
100% 基于 JSF 2的事实,这没有多大意义。<f:ajax>
这可能是我正在使用的 JSF 2.1.7 中的错误吗?(JBoss AS 7.1.1.Final 附带的实现)