提问者:小点点

p:带有onclick javascript挂钩的按钮


我使用的是带有onclick操作的p:按钮。(我无法移动到p:命令按钮,因为faces-config. xml中的遗留结果导航和db中的自定义导航历史):

<p:remoteCommand name="unlock_tt" actionListener="#{ttEntityMBean.unlock()}"/>
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" onclick="unlock_tt()"/>

由primeface生成的javascript看起来像

onclick="unlock_tt(); window.open(....)"

单击按钮后,浏览器中的unlock_tt()启动,但立即被页面重定向中断,因此支持java方法没有执行。我应该unlock_tt()还是java调用async以确保它会在浏览器离开页面之前执行?

upd:我正在考虑使用p:命令按钮,如果可以通过编程方式获取to-view-id,就像这个问题一样:

以编程方式获取导航案例

<p:commandButton action="#{ttEntityBean.unlock()}"/>
public String unlock() {
  //some business logic
  return OutcomeResolverHelper.getRuleFor(navigationMenuItemToRedirect.navigationRule)
}

这应该会减少请求数量


共2个答案

匿名用户

我不确定这是否有效,但你能试试这个吗:

而不是:

<p:remoteCommand name="unlock_tt" actionListener="#{ttEntityMBean.unlock()}"/>
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" onclick="unlock_tt()"/>

做:

<h:panelGroup>
<f:ajax event="click" listener="#{ttEntityMBean.unlock}"/>
<p:button value="#{msgs['button.ok']}" outcome="#{ttEntityMBean.navigationMenuItemToRedirect.navigationRule}" />
<h:panelGroup>

不要忘记删除onclick和您的远程代码。

这应该在您的按钮周围包裹一个panelGroup。PanelGroup实现了ClientBe行为持有者,因此它可以在其子级中获取f: ajax标记。因此,当您单击它时,它应该会触发侦听器。

匿名用户

最简单的方法是从p: button迁移到p:tordButton,它允许在重定向之前在action方法中执行一些java代码。核心是导航规则的编程翻译,在faces-config.xml中定义为base url,可用于解释jsf-2.0样式:

//receive base url from <to-view-id> tag
public static String resolveOutcomeRule(String ruleName) {
    FacesContext context = FacesContext.getCurrentInstance();
    ConfigurableNavigationHandler configNavHandler = (ConfigurableNavigationHandler)context.getApplication().getNavigationHandler();
    NavigationCase navCase = configNavHandler.getNavigationCase(context, null, ruleName);
    return navCase.getToViewId(context);
}
//decorate it with faces-redirect=true and our custom navigation
public static String resolveOutcome(NavigationMenuItem item) {
    return resolveOutcomeRule(item.getNavigationRule()) + "?faces-redirect=true&menu=" + item.getId();
}
//controller-method
public String cancelEditTT() {
    super.unlock();
    return FacesUtil.resolveOutcome(getNavigationMenuItemToRedirect());
}
//new jsf button:
<p:commandButton value="#{msgs['button.ok']}" action="#{ttEntityMBean.cancelEditTT}"/>

此解决方案提供了1步重定向而不是2步旧重定向。