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>