JSF/EL 在页面呈现期间评估 onClick。为什么?

JSF / EL evaluates onClick during rendering of page. Why?

最近我 运行 我的一个 .我有一个单独的 xhtml,其中包含有条件呈现的 icons/links 以显示不同类型的弹出窗口。这个 xhtml 基本上是我可以包含在不同页面上的特定类型弹出窗口的容器。渲染条件(和传递的 ui:parameter)确保只显示相关的 icons/links,具体取决于包含此 xhtml 的位置。这使我不必在每一页上写很多不同的 ui:includes。

对于某些弹出窗口,需要准备一些数据,这是通过 a4j:commandLink 的 onclick 属性完成的。然后,oncomplete 将显示实际的弹出窗口,如下所示:

<a4j:commandLink render="clientGroupMemberInfoPopup" rendered="#{assignmentDO.clientGroupMember}"
                 onclick="#{clientInfoBean.registerGmClientGroupMember(assignmentDO.gmClientGroupMemberDO)}"
                 oncomplete="RichFaces.ui.PopupPanel.showPopupPanel('ClientInfo')">
    <h:graphicImage value="/img/icons/icon_info_sm.png" rendered="#{!printFriendly}"/>
</a4j:commandLink>

对应的bean:

@ManagedBean
@ViewScoped
public class ClientInfoBean {

    @EJB
    private ClientService clientService;

    @Getter
    @Setter
    private ClientContextDO clientContextDO;

    @Getter
    @Setter
    private GmClientGroupMemberDO gmClientGroupMemberDO;

    @Getter
    @Setter
    private Long clientId;

    public void registerGmClientGroupMember(final GmClientGroupMemberDO aGroupMember) {
        gmClientGroupMemberDO = aGroupMember;
        clientContextDO = clientService.findByClientId(gmClientGroupMemberDO.getClientId());
    }

}

在这种情况下,a4j:commandLink 的渲染条件评估为真。但是... onclick 每次都会被评估,在包含此 xhtml 的每个页面上,一旦渲染条件评估为真。即使页面仍在加载并且还没有人点击任何东西!

为什么?防止这种情况的最佳方法是什么?有一些相对繁重的 db-stuff 正在做,以准备弹出窗口所需的所有信息。我只希望在有人实际 点击 弹出窗口的 link 时完成这些工作,而不是在页面呈现阶段。

这个问题有一个副本,我确定,但我找不到它。当 BalusC 将其标记为此类时,我将删除该答案。

onclick 用于执行javascript,而不是访问服务器端方法。所以里面的EL是作为值表达式求值的,而不是方法表达式。所以输出被认为是javascript。因此,它只是在渲染时进行评估,并在单击时重新评估。

解决办法是把onclick改成action

<a4j:commandLink render="clientGroupMemberInfoPopup" rendered="#{assignmentDO.clientGroupMember}"
                 action="#{clientInfoBean.registerGmClientGroupMember(assignmentDO.gmClientGroupMemberDO)}"
                 oncomplete="RichFaces.ui.PopupPanel.showPopupPanel('ClientInfo')">
    <h:graphicImage value="/img/icons/icon_info_sm.png" rendered="#{!printFriendly}"/>
</a4j:commandLink>