これが私がこの問題を解決した方法です。
これを行うためのより良い方法がある場合は、より良い解決策を投稿するか、コメントでお知らせください。理想的には、コンポーネントを操作するために ID でコンポーネントをフェッチするバッキング Bean の行を削除したいと考えています。バインディングはその目的のためだと思いましたか?
どんな助けでも大歓迎です。
バッキングビーン
@ManagedBean(name = "dataTableTesterBean")
@RequestScoped
public class DataTableTesterBean {
private DataTable dataTable;
private ListDataModel<String[]> dataModel;
public String initDataTable() {
buildDataModel();
buildDataTable();
return "";
}
public ListDataModel<String[]> getDataModel() {
return dataModel;
}
public void setDataModel(ListDataModel<String[]> dataModel) {
this.dataModel = dataModel;
}
public DataTable getDataTable() {
return dataTable;
}
public void setDataTable(DataTable dataTable) {
//do nada
}
private Column buildColumn(String colTitle, String colValueExpr) {
//add columns so the datatable knows what to display
Column col = (Column) JsfUtil.createComponent(Column.COMPONENT_TYPE);
UIOutput title = (UIOutput) JsfUtil.createComponent(UIOutput.COMPONENT_TYPE);
title.setValue(colTitle);
col.getFacets().put("header", title);
//setup the field that will display the column data
ValueExpression val = JsfUtil.createValueExpression(colValueExpr, Object.class);
HtmlOutputText display = (HtmlOutputText) JsfUtil.createComponent(HtmlOutputText.COMPONENT_TYPE);
display.setValueExpression("value", val);
col.getChildren().add(display);
return col;
}
private void buildDataModel() {
//build up the data
List<String[]> data = new ArrayList<>();
data.add(new String[]{"A", "123", "apples"});
data.add(new String[]{"B", "456", "oranges"});
data.add(new String[]{"C", "789", "bananas"});
data.add(new String[]{"D", "987", "lemons"});
data.add(new String[]{"E", "654", "mangoes"});
dataModel = new ListDataModel(data);
}
private void buildDataTable() {
//The following line should work, don't know why it doesn't
//dataTable = (DataTable) JsfUtil.createComponent(DataTable.COMPONENT_TYPE);
dataTable = (DataTable) JsfUtil.getUIComponent("frmTester:myDataTable");
dataTable.setVar("item");
Column abcCol = buildColumn("ABCs", "#{item[0]}");
dataTable.getColumns().add(abcCol);
Column numCol = buildColumn("Nums", "#{item[1]}");
dataTable.getColumns().add(numCol);
Column fruitCol = buildColumn("Fruits", "#{item[2]}");
dataTable.getColumns().add(fruitCol);
}
}
JSFページ
<h:form id="frmTester">
<h:commandButton value="Do Stuff" action="#{dataTableTesterBean.initDataTable}"/>
<p:dataTable id="myDataTable" value="#{dataTableTesterBean.dataModel}" binding="#{dataTableTesterBean.dataTable}" />
</h:form>