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

13

这是我的标记:

<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(按照这里的指导安装)中运行此页面。令人惊讶的是,当点击链接时,mojarra首先调用hello.renderFragments然后调用hello.setCurrentPartial,但是MyFaces采取相反的顺序,即首先调用hello.setCurrentPartial

因此,我的问题是是否有JSF规范中操作和Ajax监听器调用顺序的定义。如果已定义顺序,则哪个实现是正确的?


这确实是出乎意料的。作为解决方法,将<f:ajax listener>移动到<h:commandLink actionListener>中。我会向JSF规范团队询问这种差异。 - BalusC
@BalusC 我猜mojarra的行为是期望的(如果我错了请纠正我),监听器难道不应该先调用才对吗? - Tarik
1
@Tarik:我在规范中找不到有关这种行为的参考,但是Mojarra的行为确实更直观/自然/预期。首先侦听器,最后才是操作,就像actionListener/action的工作方式一样。我给EG留了一封邮件 - BalusC
@BalusC 好的,顺便说一下,您刚收到了第一条回复。 - Tarik
@Tarik:是的,只是我的同事提到了一份协议。 - BalusC
1个回答

5
根据专家组讨论,Mojarra的行为被认为是正确的,因为它符合actionListener/action的工作方式。MyFaces的开发人员已经在问题中提出了这个问题,并预计将在下一个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>

参见:


快速响应并提供详细的问题和解决方案说明,这一点一如既往。如果有一个理由去使用JSF,那就是@BalusC。 - xiefei
不用谢,感谢您对这个差异提出疑问,这将使JSF变得更好。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接