我有类似的东西:
<p:inputText...>
<p:ajax event="keyup" update="somefield" listener="#{someBean.doSomething}"/>
</p:inputText>
但是我不想在每个按键上执行Ajax请求,我想在用户停止写入后半秒钟执行请求。
我在另一个问题中看到jQuery解决了这个问题: How to delay the .keyup() handler until the user stops typing?
我想知道是否可以在primefaces上执行此操作,或者如何从jQuery问题中调整解决方案。
我正在使用PrimeFaces 3.0.M4。
提前谢谢。
答案 0 :(得分:18)
为什么不使用PrimeFaces的RemoteCommand组件?
它为您提供了一个全局Javascript函数,您可以随时随地调用它。它允许您调用managed-bean方法,并且它具有update
属性以进行部分更新。
<p:inputText id="input" />
<h:form>
<p:remoteCommand name="sendAjaxical" update="somefield" action="#{someBean.doSomething}"/>
</h:form>
注册事件处理程序,我从the same answer you posted借用了以下内容:
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
});
答案 1 :(得分:2)
如果选择了jquery / javascript解决方案,则无法使用Primefaces Ajax组件。您必须实现自己的javascript函数(支持ajax/xmlHttpRequest
)并在半秒后触发该函数。
但还有另一种解决方案,一种解决方法:您可以使用自动填充组件并使用3个有用的属性: valueChangeListener (A method expression that refers to a method for
handling a valuchangeevent
- 您可以使用它completeMethod
,因为您不需要返回建议), queryDelay (Delay to wait in milliseconds before sending
each query to the server
)和 minQueryLength (Number of characters to be typed before starting
to query
- 如果您不想在输入一个字符后启动ajax请求。
我希望您会发现此解决方案非常有趣...请参阅此处的自动完成组件(http://www.primefaces.org/showcase-labs/ui/autocompleteHome.jsf),您可以通过阅读Primefaces用户指南3.0.M4了解更多信息。
答案 2 :(得分:1)
快速破解会在onstart
的{{1}}中添加延迟。在javascript中的某处定义以下函数:
p:ajax
基本上,该函数在某个超时时触发ajax请求,同时为立即数返回false,并清空该timedout请求的onstart,以免陷入讨厌的循环。
然后在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;
}
:
p:ajax
延迟参数在这里是可选的,默认情况下它是2秒。