primefaces keyup事件延迟

Rot*_*eke 22 primefaces jsf-2

我有类似的东西:

<p:inputText...>
    <p:ajax event="keyup" update="somefield" listener="#{someBean.doSomething}"/>
</p:inputText>
Run Code Online (Sandbox Code Playgroud)

但我不想在每个按键上都做一个Ajax请求,我想在用户停止写入后半秒钟做请求.

我在另一个问题中看到jQuery解决了这个问题: 如何延迟.keyup()处理程序,直到用户停止输入?

我想知道是否可以在primefaces上执行此操作或如何从jQuery问题调整解决方案.
我正在使用PrimeFaces 3.0.M4.
先感谢您.

Xtr*_*ica 21

如果使用Primefaces 5.x,标签中有一个delay属性p:ajax用于此目的.所以这样做:

<p:inputText...>
    <p:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}"
        update="somefield" process="@this" />
</p:inputText>
Run Code Online (Sandbox Code Playgroud)

如果没有,你可以使用f:ajax而不是p:ajax(是的,它也可以使用)来实现它p:inputText.从JSF 2.2开始f:ajax增加了对队列控制的支持.所以代码看起来像:

<p:inputText...>
    <f:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}"
        render="somefield" execute="@this" />
</p:inputText>
Run Code Online (Sandbox Code Playgroud)

也可以看看:


Bhe*_*ung 18

为什么不使用PrimeFaces的RemoteCommand组件?

它为您提供了一个全局Javascript函数,您可以随时随地调用它.它允许您调用managed-bean方法,它具有update部分更新的属性.

<p:inputText id="input" />

<h:form>
    <p:remoteCommand name="sendAjaxical" update="somefield" action="#{someBean.doSomething}"/>
</h:form>
Run Code Online (Sandbox Code Playgroud)

注册事件处理程序,我从您发布的相同答案中借用了以下内容:

var delay = (function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();


jQuery("#input").keyup(function() {
    delay(function() { sendAjaxical(); }, 2000); //sendAjaxical is the name of remote-command
});
Run Code Online (Sandbox Code Playgroud)