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>
最近我 运行 我的一个 .我有一个单独的 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>