<p:blockUI>不响应<h:commandButton> <f:ajax>

ale*_*der 2 blockui primefaces jsf-2 commandbutton

我得到了一个<h:commandButton像:

<h:commandButton id="login"
  actionListener="#{bean.login}" value="Login"
  styleClass="btn btn-primary btn-sm">
   <f:ajax execute="@form" render="@form"/>
</h:commandButton>
Run Code Online (Sandbox Code Playgroud)

和a

<p:blockUI id="block" block=":form" trigger="login" />

它不起作用.该块永远不会显示出来.

它确实适用于<p:commandButton>.

我怎样才能实现它<h:commandbutton>.如果那是不可能的:有没有解决方法?

Bal*_*usC 6

<p:blockUI>监听PrimeFaces/jQuery特定事件pfAjaxSendpfAjaxComplete事件.这些事件由所有PrimeFaces ajax组件触发,但不是由标准JSF触发<f:ajax>.

你有3个选择:

  1. 代替<f:ajax>通过<p:ajax><h:commandButton>发送PF/jQuery的AJAX请求而不是标准JSF之一.

    <h:commandButton id="login" value="Login" action="#{bean.login}">
        <p:ajax process="@form" update="@form" />
    </h:commandButton>
    
    Run Code Online (Sandbox Code Playgroud)

    (注意:仔细阅读action和actionListener之间的差异)


  2. 附加一个全局侦听器,在<f:ajax>该侦听器上自动触发PF/jQuery特定事件.

    jsf.ajax.addOnEvent(function(data) {
        if (data.status === "begin") {
            $(document).trigger("pfAjaxSend", [null, data]);
        }
        else if (data.status === "success") {
            $(document).trigger("pfAjaxComplete", [null, data]);
        }
    });
    
    Run Code Online (Sandbox Code Playgroud)

    但是,可能会有一些不良的副作用.


  3. <p:blockUI><f:ajax>事件期间手动触发特定的事件.

    <f:ajax ... onevent="triggerBlockUI" />
    ...
    <p:blockUI widgetVar="widgetBlockUI" ... />
    
    Run Code Online (Sandbox Code Playgroud)

    有了这个JS功能.

    function triggerBlockUI(data) {
        if (data.status === "begin") {
            PF("widgetBlockUI").show();
        }
        else if (data.status === "success") {
            PF("widgetBlockUI").hide();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

不用说,选项1是最直接的选择.