Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax 未触发PF自动完成完成方法_Ajax_Jsf_Primefaces_View_Autocomplete - Fatal编程技术网

Ajax 未触发PF自动完成完成方法

Ajax 未触发PF自动完成完成方法,ajax,jsf,primefaces,view,autocomplete,Ajax,Jsf,Primefaces,View,Autocomplete,我正在从事一个使用JSF2和PrimeFaces5的项目,其中导航完全由ajax完成。当进入包含基本自动完成组件的页面时,不会触发complete方法。刷新页面时,则完整的方法正在工作。自动完成的示例: <label for="name">Your name <em>*</em></label> <br/> <p:autoComplete id="name" value="#{myBean.name}" complete

我正在从事一个使用JSF2和PrimeFaces5的项目,其中导航完全由ajax完成。当进入包含基本自动完成组件的页面时,不会触发complete方法。刷新页面时,则完整的方法正在工作。自动完成的示例:

<label for="name">Your name <em>*</em></label> <br/>
<p:autoComplete id="name" value="#{myBean.name}"
     completeMethod="#{myBean.complete}" required="true"
     requiredMessage="Please enter a name"
     placeholder="enter something..." />
你的名字*
支持bean方法:

public List<String> complete(String query){
    List<String> result = new ArrayList<>();
    for(nameData name: this.namesData){
        if(name.toLowerCase().startsWith(query.toLowerCase())){
            result.add(name);
        }
        if(result.size() == 5){
            break;
        }
    }
    return result;
}
公共列表完成(字符串查询){
列表结果=新建ArrayList();
for(nameData名称:this.nameData){
if(name.toLowerCase().startsWith(query.toLowerCase())){
结果。添加(名称);
}
if(result.size()==5){
打破
}
}
返回结果;
}
我们一直在寻找这一点,并找到了可能的解决方案,尝试实施它们,但没有解决这个问题。看起来很奇怪,因为关于这个问题的帖子都是从旧版本的PF(3.X)开始的。供参考

正在添加此脚本

<script type="text/javascript">
        PrimeFaces.escapeRegExpOld = PrimeFaces.escapeRegExp;
        PrimeFaces.escapeRegExp = function(c) {
            var t = PrimeFaces.escapeRegExpOld(c);
            t = t.replace('&amp;', '&amp;amp;');
            return t;
        };
 </script>

PrimeFaces.escapeRegExpOld=PrimeFaces.escapeRegExp;
PrimeFaces.escapeRegExp=函数(c){
var t=PrimeFaces.escapeRegExpOld(c);
t=t.替换(“&;”、“&;”);
返回t;
};
添加此函数并在autocomplete获得焦点时调用它

<script type="text/javascript">
            function escapeTerm(request) {
                request.term = encodeURIComponent(request.term);
            }
 </script>

函数转义器(请求){
request.term=encodeURIComponent(request.term);
}

谢谢你的时间

所以,在调试了很多之后,我可以找到一个解决方案。尽管如此,我不太清楚这个错误的原因

在实现了primefaces的Autocomplete渲染器的副本之后,我在去bug时注意到没有执行decode方法,因此没有触发complete方法。我认为这是因为组件没有出现在视图根目录下的组件树上(打印在日志上以进行检查),所以在调用应用程序阶段,它无法在输入自动完成的内容后解码组件。。。然后我在“encodeScript”方法中遇到了这段代码

由于我的项目正在开发中,我认为这就是问题所在。所以我考虑了日志消息。调试此代码时,不会打印日志警告,因为自动完成对象上不存在这些属性。尽管如此,我还是使用了查询ajax事件而不是completemethod,然后执行解码,即使complete方法没有触发。经过几次尝试,我的工作原理如下:

<label for="name">Your name <em>*</em></label> <br/>
<p:autoComplete id="name" value="#{myBean.name}"
     completeMethod="#{myBean.complete}" required="true"
     requiredMessage="Please enter a name"
     placeholder="enter something..." >
   <p:ajax event="query" />
</p:autoComplete>
你的名字*

希望能有帮助。如果有人比我更清楚,请公布原因。

这是打字错误还是配置的
completeMethod
与您编写的完整方法不匹配?如果客户端出现问题,请始终查看浏览器的JS控制台和HTTP流量监视器以获取线索。有时,服务器日志也可能包含提示/线索。@kolossus是的,这是一个键入错误。我编辑了这个问题。
<label for="name">Your name <em>*</em></label> <br/>
<p:autoComplete id="name" value="#{myBean.name}"
     completeMethod="#{myBean.complete}" required="true"
     requiredMessage="Please enter a name"
     placeholder="enter something..." >
   <p:ajax event="query" />
</p:autoComplete>