我正在使用JSF 2& amp; Primefaces 5导航完全由ajax完成。进入具有基本自动完成组件的页面时,不会触发完整方法。刷新页面时,完整的方法正在运行。自动填充的示例:
<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..." />
Backing 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;
}
一直在寻找这个并找到可能的解决方案,尝试实施它们但没有解决这个问题。似乎很奇怪,因为这个问题的帖子是旧版PF(3.X)的日期。 FYI;
添加此脚本...
<script type="text/javascript">
PrimeFaces.escapeRegExpOld = PrimeFaces.escapeRegExp;
PrimeFaces.escapeRegExp = function(c) {
var t = PrimeFaces.escapeRegExpOld(c);
t = t.replace('&', '&amp;');
return t;
};
</script>
添加此功能并在自动完成功能获得焦点时调用它
<script type="text/javascript">
function escapeTerm(request) {
request.term = encodeURIComponent(request.term);
}
</script>
谢谢你的时间!
答案 0 :(得分:2)
因此,经过多次调试后,我找到了解决方案。尽管如此,我还不太清楚这个bug的原因。
在实现了primefaces的自动完成渲染器的副本后,我注意到在重新编译时没有执行解码方法,因此没有触发完整的方法。我认为这是因为组件没有从视图根目录中显示在组件树上(在日志上将其打印到检查中),因此在调用应用程序阶段后,在输入自动完成的内容后,它无法解码组件。然后我在“encodeScript”方法上遇到了这段代码。
f (context.isProjectStage(ProjectStage.Development)) {
if (ac.getAttributes().containsKey("process")
|| ac.getAttributes().containsKey("global")
|| ac.getAttributes().containsKey("onstart")
|| ac.getAttributes().containsKey("oncomplete")) {
LOG.warning("The process/global/onstart/oncomplete attribute of AutoComplete was removed. Please use p:ajax with the query event now");
}
}
由于我的项目是在开发,我认为这是问题所在。所以我考虑了日志消息。调试此代码时,未打印日志警告,因为自动完成对象上不存在这些属性。尽管如此,我使用查询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..." >
<p:ajax event="query" />
</p:autoComplete>
希望它有所帮助。如果有人能澄清比我更多,请说明原因。