如何以编程方式/动态方式将组件添加到 p:dataTable facet [英] how to add component programmatically/dynamically to a 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屋!