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

时间:2015-02-04 19:30:31

标签: ajax jsf primefaces view autocomplete

我正在使用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;', '&amp;amp;');
            return t;
        };
 </script>

添加此功能并在自动完成功能获得焦点时调用它

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

谢谢你的时间!

1 个答案:

答案 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>

希望它有所帮助。如果有人能澄清比我更多,请说明原因。