h:commandLink 操作和 f:ajax 侦听器的调用顺序
Call order of h:commandLink action and f:ajax listener
这是我的标记:
<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)中 运行 此页面.令人惊讶的是,当单击 link 时,mojarra 先调用 hello.renderFragments
,然后调用 hello.setCurrentPartial
,但 MyFaces 采用相反的顺序,即先调用 hello.setCurrentPartial
。
所以我的问题是在JSF Spec中是否有关于动作调用顺序和ajax监听器的定义。如果定义了顺序,哪种实现是正确的?
根据上面的 EG discussion, there's agreement on Mojarra behavior being correct as it's in line with how actionListener
/action
work. The MyFaces guy has created an 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>
另请参阅:
- Differences between action and actionListener
这是我的标记:
<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)中 运行 此页面.令人惊讶的是,当单击 link 时,mojarra 先调用 hello.renderFragments
,然后调用 hello.setCurrentPartial
,但 MyFaces 采用相反的顺序,即先调用 hello.setCurrentPartial
。
所以我的问题是在JSF Spec中是否有关于动作调用顺序和ajax监听器的定义。如果定义了顺序,哪种实现是正确的?
根据上面的 EG discussion, there's agreement on Mojarra behavior being correct as it's in line with how actionListener
/action
work. The MyFaces guy has created an 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>
另请参阅:
- Differences between action and actionListener