primefaces 轮询动态间隔

primefaces poll dynamic interval

我写了这样的示例代码:

@ViewScoped
@Named
public class SampleBean implements Serializable {

    private int interval = 1;


    public void execute() {
        switch (interval) {
            case 1:
                System.out.println("1 Executed ...");
                break;
            case 2:
                System.out.println("2 Executed ...");
                break;
            case 3:
                System.out.println("3 Executed ...");
                break;
        }
    }

    public int getInterval() {
        return interval;
    }

    public void setInterval(int interval) {
        this.interval = interval;
    }
}    

和这个 xhtml:

<h:form>
        <p:selectOneButton value="#{sampleBean.interval}">
            <f:selectItem itemLabel="1" itemValue="1"/>
            <f:selectItem itemLabel="2" itemValue="2"/>
            <f:selectItem itemLabel="3" itemValue="3"/>
        </p:selectOneButton>

        <p:poll interval="#{sampleBean.interval}" listener="#{sampleBean.execute}" id="poll"/>

    </h:form>    

我想动态更新 primefaces 轮询组件的间隔时间,但我的示例代码没有改变。睡眠总是每 1 秒执行一次。
我的代码有什么问题?

您需要告诉 p:poll 组件重新获取它的支持 bean 值。您可以通过在组件上调用新的渲染阶段(通过 PrimeFaces update 或通过 f:ajax render)轻松完成此操作。

所以要让它工作,你只需要做这样的事情,

<h:form>
    <p:selectOneButton value="#{sampleBean.interval}">
        <f:selectItem itemLabel="1" itemValue="1"/>
        <f:selectItem itemLabel="2" itemValue="2"/>
        <f:selectItem itemLabel="3" itemValue="3"/>
        <f:ajax render="@form"/>
    </p:selectOneButton>
    <p:poll interval="#{sampleBean.interval}" listener="#{sampleBean.execute}" id="poll"/>
</h:form>    

注意上面的 f:ajax 调用。

您需要定位封闭(父)组件以使其刷新 - 这就是我们直接定位表单而不是轮询组件的原因。