如何以编程方式/动态方式将组件添加到 p:dataTable facet [英] how to add component programmatically/dynamically to a p:dataTable facet

查看:28
本文介绍了如何以编程方式/动态方式将组件添加到 p:dataTable facet的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的 <p:dataTable> 添加一个全局过滤器,我从托管 bean 以编程方式创建了该过滤器.该表工作正常并正确呈现,但是在 datatable facet 中仅呈现最后添加的组件.这是我试过的代码:

I'm trying to add a global filter for my <p:dataTable> of which I create programmatically from a managed bean. The table works fine and renders correctly, however only the last added component is rendered in the datatable facet. Here is the code I tried:

    //config
    FacesContext fc = FacesContext.getCurrentInstance();
    Application application = fc.getApplication();
    ExpressionFactory ef = application.getExpressionFactory();
    ELContext elc = fc.getELContext();

    //Table
    table = (DataTable) application.createComponent(DataTable.COMPONENT_TYPE);
    table.setId("tabexam");
    table.setValue(listexam);
    table.setVar("exam");
    table.setWidgetVar("examTable");
    table.setEmptyMessage("aucun résultat trouvé pour votre recherche");
    table.setFilteredValue(filteredexams);
    table.setPaginator(true);
    table.setPaginatorPosition("bottom");
    table.setRows(25);
    table.setPaginatorTemplate("{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}");
    table.setRowsPerPageTemplate("10,25,50,100");


    /////////this is the part that regards this question///////////
    /*
     this is the HTML code that i want to translate to java code :
     <f:facet name="header" >  
     <h:outputText value="Rechercher:  "/>  
     <p:inputText id="globalFilter" onkeyup="examTable.filter();" style="width:200px" /> 
     </f:facet> 
    */
    UIOutput tableTitle = (UIOutput) application.createComponent(UIOutput.COMPONENT_TYPE);

    tableTitle.setValue("Rechercher :");

    HtmlInputText globalfilterinput = (HtmlInputText) application.createComponent(HtmlInputText.COMPONENT_TYPE);
    globalfilterinput.setId("globalFilter");
    ValueExpression globalfilterJSaction = ef.createValueExpression(elc, "examTable.filter()", Object.class);
    globalfilterinput.setValueExpression("onkeyup", globalfilterJSaction);


    Map comps = new HashMap();

    comps.put("header", tableTitle);
    comps.put("header", globalfilterinput);

    table.getFacets().putAll(comps);

    /////////////////////////////////////////////////// 

    //Index
    Column indexColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
    UIOutput indexColumnTitle = (UIOutput) application.createComponent(UIOutput.COMPONENT_TYPE);
    indexColumnTitle.setValue("Index");
    indexColumn.getFacets().put("header", indexColumnTitle);
    //table.getColumns().add(column);
    table.getChildren().add(indexColumn);

    ValueExpression indexValueExp = ef.createValueExpression(elc, "#{exam.examen.studyPatientState}", Object.class);
    HtmlOutputText indexOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    indexOutput.setValueExpression("value", indexValueExp);
    indexColumn.getChildren().add(indexOutput);

    //Name Column
    Column nameColumn = (Column) application.createComponent(Column.COMPONENT_TYPE);
    UIOutput nameColumnTitle = (UIOutput) application.createComponent(UIOutput.COMPONENT_TYPE);
    nameColumnTitle.setValue("Name");
    nameColumn.getFacets().put("header", nameColumnTitle);
    table.getChildren().add(nameColumn);

    ValueExpression nameValueExp = ef.createValueExpression(elc, "#{exam.examen.rapport.rapportOraleState}", Object.class);
    HtmlOutputText nameOutput = (HtmlOutputText) application.createComponent(HtmlOutputText.COMPONENT_TYPE);
    nameOutput.setValueExpression("value", nameValueExp);
    nameColumn.getChildren().add(nameOutput);

推荐答案

就像在普通的 XHTML/Facelets 代码中一样,一个 只能有 一个孩子.

Like in normal XHTML/Facelets code, a <f:facet> can have only one child.

这,如您的代码注释所示,

This, as indicated in your code comment,

<f:facet name="header" >  
    <h:outputText value="Rechercher:  "/>  
    <p:inputText id="globalFilter" onkeyup="examTable.filter();" style="width:200px" /> 
</f:facet> 

已经无效.它也不会在 Facelets 中工作.您需要将其包装在 中.

is already invalid. It wouldn't have worked in Facelets either. You need to wrap it in a <h:panelGroup>.

<f:facet name="header" >  
    <h:panelGroup>
        <h:outputText value="Rechercher:  "/>  
        <p:inputText id="globalFilter" onkeyup="examTable.filter();" style="width:200px" /> 
    </h:panelGroup>
</f:facet> 

只需在 Java 代码中执行相同操作即可.请记住:没有什么没有可以只能在Java代码中完成而不能在XHTML中完成,反之亦然.Java 中所有可能的事情也可以使用纯 XHTML(与 JSP 不同)来实现.唯一的区别是 XHTML 在这方面通常不那么冗长,而且更易于维护.

Just do the same in Java code. Remember: there's nothing which can only be done in Java code and not in XHTML, or vice versa. Everything which is possible in Java is also possible using pure XHTML (unlike JSP). Only difference is that XHTML is generally much less verbose and more maintenance friendly in this area.

这篇关于如何以编程方式/动态方式将组件添加到 p:dataTable facet的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆