p:autoComplete - 通过自定义AJAX调用而不是bean

时间:2018-03-14 20:29:56

标签: ajax jsf primefaces autocomplete

我们正在使用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所有东西的新手。

编辑 - 经过三天的挣扎,事实证明已经有了可用于获取此数据的服务。我已经能够放弃这整个黑客。

0 个答案:

没有答案