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