当前位置: 首页 > 知识库问答 >
问题:

由自定义组件实例化的PrimeFaces自动完成不显示建议

王才
2023-03-14

动态实例化PF 3.4.2自动完成组件时,我遇到了一个问题。组件最初呈现ok,部分处理时刷新其值,但从不显示建议。

我通过以下方式实例化此控件:

    AutoComplete ac = (AutoComplete) context.getApplication().createComponent(AutoComplete.COMPONENT_TYPE);
    final String varName = "p";

    ValueExpression ve = JSFUtils.createValueExpression("#{minContext.selected.sen}"), Sen.Type);
    ac.setValueExpression("value", ve);

    ac.setForceSelection(true);

    ac.setVar(varName);

    ValueExpression itemLabel = JSFUtils.createValueExpression("#{sc:senLibelle(p)}"), String.class);
    ac.setValueExpression("itemLabel", itemLabel);

    ValueExpression itemValue = JSFUtils.createValueExpression("#{" + varName + "}");
    ac.setValueExpression("itemValue", itemValue);

    MethodExpression completeMethod = JSFUtils.createMethodExpression("#{senUtils.completeAllSens}", List.class,new Class[]{String.class});
    ac.setCompleteMethod(completeMethod);

然后使用将其添加到父控件

    getChildrens().add(ac);

父组件是PF PanelGrid的派生。我使用这种方法成功地生成了各种版本面板,效果非常好。但我不明白为什么它没有自动完成。

父控件看起来像:

@FacesComponent(SenatDataTableEntryDetail.SENAT_COMPONENT_TYPE)
public class SenatDataTableEntryDetail extends PanelGrid {

    /** Leaving renderer unchanged, so that PF renderer for PanelGrid is used.
     */
    public static final String SENAT_COMPONENT_FAMILY = "fr.senat.faces.components";
    public static final String SENAT_COMPONENT_TYPE = SENAT_COMPONENT_FAMILY + ".SenatDataTableEntryDetail";

    private enum PropertyKeys { mapper, bean; }

    @Override
    public void encodeBegin(FacesContext context) throws IOException {
        super.encodeBegin(context);
        addDynamicChildren(context);
    }

    @Override
    public boolean getRendersChildren()
    {
        return true;
    }

    ...

    private Boolean isInitialized() {
        return (Boolean)getStateHelper().eval(SENAT_INITIALIZED,false);
    }

    private void setInitialized(Boolean param) {
        getStateHelper().put(SENAT_INITIALIZED, param);
    }

    private void addDynamicChildren(FacesContext context)  throws IOException {
        if(isInitialized()) {
            return;
        }
        setInitialized(true);
        /* components are instiated and added as children only once */
    }    
}

它只是将子对象添加到面板网格。

自定义组件声明的其他方面(在taglib等中)也可以。

问题似乎并不存在于EL表达式、completeMethod定义等中。如果我在测试xhtml页面中包含具有相同参数的p:autoComplete实例,则它只会按预期工作:

    <p:autoComplete value="#{minContext.selected.sen}" forceSelection="true" 
                        var="p" itemLabel="#{sc:senLibelle(p)}" itemValue="#{p}"
                        completeMethod="#{senUtils.completeAllSens}"/>

我注意到PF自动完成组件有点特殊,因为它在检测到查询时呈现不同。请参阅中的Autocompleterender源代码http://primefaces.googlecode.com/files/primefaces-3.4.2.zip .

在“动态实例化”的情况下,没有调用这个组件的解码方法。我没能找到最后几天的原因,但没有成功。

我期待您对检查什么来纠正这个烦人的“错误”提出建议。

共有1个答案

逄学潞
2023-03-14

因此,问题在于id的生成(参见两条注释)。

组件实例化的开始是:

AutoComplete ac = (AutoComplete) context.getApplication().createComponent(AutoComplete.COMPONENT_TYPE);
ac.setParent(this);
ac.setId(...some application specific unique id generation...);

final String varName = "p";

通过这种方式,在生成客户端id时适当考虑了命名容器。

 类似资料:
  • 我试图创建自己的自定义angular material组件,该组件能够使用控件。 除此之外,我希望该控件使用指令。 我的目的只是创建一个更好看的组件,该组件包含一个集成的clear按钮和自定义css箭头,如下图所示。我使用标准组件成功地获得了它,并添加了我想要的内容,但现在我想将它导出到泛型组件中。 null 即使正确选择了值,我的窗体也无效。 选择某个选项后,占位符自身设置不正确。 自动完成筛选

  • 我试图得到一个自动完成列表弹出,使用此链接作为指导。 我得到的错误消息: w/filter:performFiltering()期间发生异常!java.lang.nullPointerException:collection==null at java.util.ArrayList.(arrayList.java:94)at android.widget.arrayAdapter$arrayFil

  • 我正在使用primefaces AutoMLETE强制选择按名称搜索帐户 JSF组件 Bean方法: 这工作正常,现在如果我想把搜索更改为在查询值中搜索账号。我使用了以下内容: 但是,过滤器只返回搜索号码,而忽略名称搜索。我怎样才能做到这一点?

  • 本文向大家介绍Vue结合原生js实现自定义组件自动生成示例,包括了Vue结合原生js实现自定义组件自动生成示例的使用技巧和注意事项,需要的朋友参考一下 就目前三大前端主流数据驱动框架(vue,ng,react)而言,均具有创建自定义组件的api,但都是必须先做到事先写好挂载点,这个挂载点可以是原有静态元素标签也可以是自定义模板;对于多种组件通过同一数据流生成的,如果事先在页面上写好挂载点(moun

  • 我正在编写一组定制的PrimeFaces组件,使用PrimeFaces5.0,并在JBoss EAP6.2中运行。 null 2.2在myFaceStest.taglib.xml中,我定义了输入标记: 2.3在input.java(我的自定义组件)中,我执行以下操作: 2.4此组件的呈现器包含以下内容: 给定这种设置,为什么自定义组件不会呈现?我的jboss日志中没有任何内容,即使日志级别设置为d

  • 我不确定这是否可能。。。但是我想使用autoComplete组件,其中value属性是String类型,completeMethod返回一些重对象的列表。 我还需要使用 这是我认为应该起作用的(但没有): 这是返回建议列表的方法: 如果用户选择一个建议,它会将itemValue设置为所选建议的名称,但会显示Demandeur对象中包含两个值的串联字符串。 建议确实会出现,我可以选择它们,但不幸的是