h:commandLink动作和f:ajax监听器的调用顺序

时间:2015-03-06 14:49:20

标签: ajax jsf jsf-2.2 myfaces

这是我的标记:

<h:commandLink value="#{partial}" action="#{hello.setCurrentPartial(partial)}">
    <f:ajax render="include" listener="#{hello.renderFragments}"/>
</h:commandLink>

我尝试在Mojarra-2.2.8(wildfly 8.2.0.Final内置)和MyFaces-2.2.7(按指导here安装)中运行此页面。令人惊讶的是,当点击链接时,mojarra首先调用hello.renderFragments,然后调用hello.setCurrentPartial,但MyFaces采用相反的顺序,即首先调用hello.setCurrentPartial

所以我的问题是JSF Spec中是否有动作调用顺序和ajax监听器的定义。如果定义了订单,哪个实现是正确的?

1 个答案:

答案 0 :(得分:5)

根据EG discussion,Mojarra的行为是正确的,因为它符合actionListener / action的工作方式。 MyFaces家伙已经在其上创建了一个issue,并且预计这将在下一个MyFaces版本中得到修复。并且,JSF规范应该更加明确,这将是有效的。

同时,如果您希望Mojarra和MyFaces中的方法与方法调用顺序相同,请将<f:ajax listener>移至<h:commandLink actionListener>

<h:commandLink value="#{partial}" actionListener="#{hello.renderFragments}" action="#{hello.setCurrentPartial(partial)}">
    <f:ajax render="include" />
</h:commandLink>

另见: