我们正在使用PrimeFaces 5.3。由于我无法控制的情况,我需要通过AJAX调用而不是通过支持bean来获取AutoComplete的数据。我已经能够使它工作但有两个问题:
1)为了更新支持bean,我需要使AJAX调用同步
2)我无法去除AJAX调用
到目前为止我的技术(没有去抖动)是:
在AutoComplete上,从onkeydown事件设置对我的js函数的引用(我也试过onkeypress):
<p:autoComplete id="myThing" completeMethod="#{myBean.completeMyThing}" onkeydown="myFunction(event)" />
在我的脚本中,使用同步AJAX调用定义myFunction,其中成功处理程序调用RemoteCommand:
<script type="text/javascript">
//<![CDATA[
function myFunction(e) {
var value = e.srcElement.value;
$.ajax({
url: "myURL",
data: {
query: value
},
type: 'POST',
async: false,
success: function (data) {
myRCfunction( [{ name: 'param1', value: JSON.stringify(data) }, { name: 'query', value: value }] );
}
});
}
//]]>
在页面的其他位置,定义一个绑定到辅助bean的RemoteCommand函数:
<p:remoteCommand name="myRCfunction" actionListener="#{myBean.handlerFn}" />
最后,在支持bean中,我更新了由AutoComplete用作建议的值:
public void handlerFn() {
//get the request param values, and use them to update the list of things
thingService.updateThings(things);
}
最后,completeMyThing函数只从thingService获取Things列表:
public List<Thing> completeMyThing(String query) {
List<Thing> allThings = thingService.getThings();
return allThings;
}
当你只输入一个字符时,一切正常;输入多个字符时它不起作用,因为onkeydown事件没有去抖动。
当我去抖动myFunction函数时,我开始看到控制台错误,其中POJO转换器试图运行getAsObject而不是getAsString。
我的第一个问题是 - 是不是有更简单的方法来做到这一点?正如我所说,由于我无法控制的原因,我无法从支持bean发出HttpPost请求。那是我的第一次尝试。
其次,我知道queryDelay会去掉AutoComplete的查询...但是这也不会去除onkeydown或onkeypress处理程序;还有,似乎没有一个新手处理程序?是否有一个事件我可以勾解已经被去除的事了?
这一切似乎都让我感到非常困惑;但我是JSF所有东西的新手。
编辑 - 经过三天的挣扎,事实证明已经有了可用于获取此数据的服务。我已经能够放弃这整个黑客。