这是我的标记:
<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监听器的定义。如果定义了订单,哪个实现是正确的?
答案 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>