Jsf 2 primefaces键控或其他ajax事件延迟

Jsf 2 primefaces键控或其他ajax事件延迟,jsf-2,primefaces,Jsf 2,Primefaces,我有点像: <p:inputText...> <p:ajax event="keyup" update="somefield" listener="#{someBean.doSomething}"/> </p:inputText> 但我不想在每次按键时都执行Ajax请求,我希望在用户停止编写后的半秒钟执行请求 我在另一个问题中看到jQuery解决了这个问题: 我想知道是否可以在primefaces上执行此操作,或者如何调整jQuery问题的解决

我有点像:

<p:inputText...>
    <p:ajax event="keyup" update="somefield" listener="#{someBean.doSomething}"/>
</p:inputText>

但我不想在每次按键时都执行Ajax请求,我希望在用户停止编写后的半秒钟执行请求

我在另一个问题中看到jQuery解决了这个问题:

我想知道是否可以在primefaces上执行此操作,或者如何调整jQuery问题的解决方案。
我正在使用PrimeFaces 3.0.M4。

提前感谢您。

如果您选择jquery/javascript解决方案,就不能使用Primefaces Ajax组件。您必须实现自己的javascript函数(支持
ajax/xmlHttpRequest
并在半秒钟后触发该函数

但是还有另一种解决方案,一种变通方法:您可以使用一个自动完成组件,并使用3个有用的属性:valueChangeListener
一个引用
处理valuchangeevent
-您使用它而不是
completeMethod
,因为您不需要返回建议),QueryDisplay
延迟以毫秒为单位等待发送)
对服务器的每个查询
)和minQueryLength
开始前要键入的字符数
查询
-如果您不想在键入一个字符后启动ajax请求)


我希望您会发现这个解决方案非常有趣……请在此处查看自动完成组件()并通过阅读Primefaces 3.0.M4用户指南了解更多信息。

为什么不使用Primefaces的组件

它为您提供了一个全局Javascript函数,您可以随时随地调用该函数。它允许您调用托管bean方法,并且它具有用于部分更新的
update
属性

<p:inputText id="input" />

<h:form>
    <p:remoteCommand name="sendAjaxical" update="somefield" action="#{someBean.doSomething}"/>
</h:form>

一个快速的破解方法是在
p:ajax
onstart
中增加延迟。在javascript中的某个位置定义以下函数:

function keyupDelay(request, cfg, delay) {
    delay = delay || 2000;// if no delay supplied, two seconds are the default seconds between ajax requests
    setTimeout(function() {
        cfg.onstart = null;
        request.send(cfg)
    }, delay);
    return false;
}
基本上,该函数会在某个超时时间触发ajax请求,同时为立即超时返回false,并在该timedout请求上清空onstart,以避免陷入令人讨厌的循环

然后在
p:ajax
上:

<p:ajax event="keyup" onstart="return keyupDelay(this, cfg)" />


这里的延迟参数是可选的,默认为2秒。

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

<p:inputText...>
    <p:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}"
        update="somefield" process="@this" />
</p:inputText>
另请参见:


这可以用我想要的延迟调用bean方法,但它没有更新(我需要更新),在执行valueChangeListener时也没有提交值。但是这个答案帮助我找到了其他的解决办法。非常感谢。这很有效,我不知道remoteComand。我不得不将脚本的jQuery部分替换为:
函数ajaxDelay(){delay(function(){sendAjaxical();},2000);}
并像这样调用它
非常感谢!
f:ajax
是否支持每个PrimeFaces组件具有的所有事件,或者是否存在限制?@Kukeltje,对此不确定。理论上,
p:ajax
是一个更强大的实现,但是组件也应该与
f:ajax
一起工作。无论如何,这个答案是不使用
f:ajax
的唯一缺点。在这个具体的例子中,IMO.试图在
p:ajax
中添加“延迟”吗?根据文件,它是存在的。@Kukeltje,你说得对。它是为5.x添加的。我将更新我的答案;-)现在我想要一半的声誉;-)
<p:inputText...>
    <p:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}"
        update="somefield" process="@this" />
</p:inputText>
<p:inputText...>
    <f:ajax event="keyup" delay="1000" listener="#{someBean.doSomething}"
        render="somefield" execute="@this" />
</p:inputText>