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

PF Autocomplete completemethod is not being triggered

我正在开发一个使用 JSF 2 和 Primefaces 5 的项目,其中导航完全由 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;
}

一直在寻找这个并找到可能的解决方案,尝试实施它们但没有解决这个问题。看起来很奇怪,因为关于这个问题的帖子来自旧版本的 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>

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

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

感谢您的宝贵时间!

所以,经过大量调试后,我找到了解决方案。尽管如此,我不太清楚这个错误的原因。

在实现 primefaces 的自动完成渲染器的副本后,我注意到在调试时没有执行 decode 方法,因此没有触发 complete 方法。我认为这是因为该组件没有出现在视图根目录中的组件树上(将其打印在日志上以进行检查),因此在调用应用程序阶段它无法在输入自动完成的内容后解码该组件。 .然后我在"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 事件而不是 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>

希望对您有所帮助。如果有人能比我更清楚,请 post 原因。