如何实现Primefaces progressBar的更新处理程序?

roo*_*kit 3 jsf primefaces jsf-2

我有一个常规的Ajax PF progressBar:

        <p:progressBar value="#{myTask.progress}" labelTemplate="{value}%" ajax="true" widgetVar="progress">
            <p:ajax event="complete" oncomplete="progress.cancel();"></p:ajax>
        </p:progressBar>
Run Code Online (Sandbox Code Playgroud)

每当progressBar更新它的值时,如何运行我的JavaScript代码?

kol*_*sus 7

使用该RequestContext对象从服务器端执行javascript.要使用它:

  1. 在您的辅助bean中定义一个方法,您将在该方法中使用该RequestContext对象

    public void doJs() {
        RequestContext ctx = RequestContext.getCurrentInstance();
        context.execute("progress.cancel();");
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在该listener属性中设置此方法<p:ajax/>

    <p:progressBar value="#{myTask.progress}" labelTemplate="{value}%" ajax="true"
        widgetVar="progress">
        <p:ajax event="complete" listener="#{theBean.doJs}"/>
    </p:progressBar>
    
    Run Code Online (Sandbox Code Playgroud)

编辑:要在每次ajax更新后执行执行,设置有点不同:

  1. interval属性添加到进度条以引入更好的受控轮询机制

    <p:progressBar value="#{myTask.progress}" labelTemplate="{value}%" ajax="true"
        widgetVar="progress" interval="3000">
    
    Run Code Online (Sandbox Code Playgroud)
  2. <f:event/>在组件的页面生命周期中添加一个钩子,并从那里执行服务器端更新.我打算推荐这个PostValidateEvent活动

    <p:progressBar value="#{myTask.progress}" labelTemplate="{value}%" ajax="true"
        widgetVar="progress" interval="3000">
        <f:event type="postValidate" listener="#{theBean.doJs}" />
    </p:progressBar>
    
    Run Code Online (Sandbox Code Playgroud)