Динамический столбец в JSF Datatable JSF2.0 - PullRequest
1 голос
/ 13 декабря 2011

Мне нужна одна помощь от вас. Я использую JSF 2.0, и у меня есть компонент данных. Один из столбцов в таблице данных - это столбец действий, и мне нужно создать панель инструментов, которая содержит другой тип компонента источника действия, такой как командная кнопка, ссылка и т. Д. Тип источника действия определяется во время выполнения, а количество источника действия также выполняется в время выполнения. Как я могу реализовать это в JSF 2.0

           <p:dataTable value="#{listBranchBean1.rowDataModel}" var="rowItem"
              id="myId" paginator="true"
              paginatorTemplate="{FirstPageLink}{PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}{RowsPerPageDropdown} "
              rowsPerPageTemplate="10,5,2" previousPageLinkLabel="&lt;"
              nextPageLinkLabel="&gt;" widgetVar="branchTable"
              selection="#{listBranchBean1.selectedBranchesPrime}"
              resizableColumns="true"
              sortBy="#{rowItem.columnsValueMap['branchId'].value}">
              <f:facet name="header">
                 <p:outputPanel>
                    <h:outputText value="Search all fields:" />
                    <p:inputText id="globalFilter" onkeyup="branchTable.filter()"
                       style="width:150px" />
                 </p:outputPanel>
              </f:facet>
              <p:column selectionMode="multiple" style="text-align:left">
                 <f:facet name="header">
                    <h:outputText value="Select" />
                 </f:facet>
                 <h:outputText value="#{rowItem.uniqueId}" />
              </p:column>
              <p:column
                 rendered="#{listBranchBean1.columnsMap['objectId'].hidden==false}"
                 sortBy="#{rowItem.columnsValueMap['objectId'].value}"
                 filterBy="#{rowItem.columnsValueMap['objectId'].value}">
                 <f:facet name="header">
                    <h:outputText
                       value="#{listBranchBean1.columnsMap['objectId'].displayLabel}" />
                 </f:facet>
                 <h:outputText
                    value="#{rowItem.columnsValueMap['objectId'].value}" />
              </p:column>
              <p:column
                 rendered="#{listBranchBean1.columnsMap['actions'].hidden==false}">
                 <f:facet name="header">
                    <h:outputText
                       value="#{listBranchBean1.columnsMap['actions'].displayLabel}" />
                 </f:facet>
                 <p:toolbar>
                    <p:toolbarGroup>
                       <ui:repeat var="action"
                          value="#{rowItem.columnsValueMap['actions'].value}">
                          <p:commandButton title="#{action}" type="button">
                          </p:commandButton>
                       </ui:repeat>
                    </p:toolbarGroup>

                 </p:toolbar>
              </p:column>
           </p:dataTable>

Я хочу заменить последний столбец чем-то вроде

                 <p:toolbar binding="#{listBranchBean1.getActions(rowItem)}">
                 </p:toolbar>

Я ценю вашу помощь

Праджиш Наир

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

Существует разница между временем сборки и временем рендеринга в JSF.Теги времени сборки, такие как <ui:repeat>, могут динамически создавать новые компоненты, но они могут использовать только те данные, которые доступны во время сборки.

Однако, используя Java, вы также можете изменять дерево компонентов.программно, но это тоже не может произойти в любой момент.Безопасный момент для этого - preRenderViewEvent, что немного позже, чем момент времени сборки (то есть фаза restore view), и к тому времени у вас должны быть все необходимые данные.

Внутри обработчика события для этого события вы можете ссылаться на панель инструментов, которую вы привязали к своему компоненту поддержки, и программно добавлять к ней столбцы.

Примеры см .:

Примечаниечто если ваш резервный бин @ViewScoped, вам лучше не использовать привязку, а вместо этого использовать ручной поиск.Это связано с некоторыми ошибками в отношении области видимости и компонентов связывания в JSF.

0 голосов
/ 12 сентября 2013

ниже кода создаст динамический столбец на основе выбранной страны

public void loadDynamicList() throws Exception {
int i=0;
 dynamicList = new ArrayList<List<String>>();
dynamicList.add(Arrays.asList(new String[] { "ID1" }));
existingCountryList = new ArrayList<Country>();
String countryCode="US";
existingCountryList.add(getCountryService().getCountryByCode(countryCode));
Country country=getCountryService().getCountryByCode(countryCode);
countryLanguageSet=country.getCountryLanguage();
i=country.getCountryLanguage().size();
dynamicHeaders = new String[i] ;
int j=0;
   for (CountryLanguage count: countryLanguageSet) {
    System.out.println(count.getLanguage().getLanguageName());
    dynamicHeaders[j]=count.getLanguage().getLanguageName();
    j++;
}
 }
public void populateDynamicDataTable() {
debugLogger.debug("populateDynamicDataTable:Enter");
// Create <h:dataTable value="#{myBean.dynamicList}" var="dynamicItem">.
HtmlDataTable dynamicDataTable = new HtmlDataTable();
dynamicDataTable.setValueExpression("value", createValueExpression("#{relationBean.dynamicList}", List.class));
dynamicDataTable.setVar("dynamicItem");

// Iterate over columns.
for (int i = 0; i < dynamicHeaders.length; i++) {
    // Create <h:column>.
    HtmlColumn column = new HtmlColumn();
    dynamicDataTable.getChildren().add(column);
    // Create <h:outputText value="dynamicHeaders[i]"> for <f:facet name="header"> of column.
    HtmlOutputText header = new HtmlOutputText();
    header.setValue(dynamicHeaders[i]);
    column.setHeader(header);
     HtmlInputText input=new HtmlInputText();
    column.getChildren().add(input);
}
   dynamicDataTableGroup = new HtmlPanelGroup();
dynamicDataTableGroup.getChildren().add(dynamicDataTable);
debugLogger.debug("populateDynamicDataTable:Exit");
}

public HtmlPanelGroup getDynamicDataTableGroup() throws Exception {
// This will be called once in the first RESTORE VIEW phase.
if (dynamicDataTableGroup == null) {
    loadDynamicList(); // Preload dynamic list.
    populateDynamicDataTable(); // Populate editable datatable.
}

return dynamicDataTableGroup;
}


public List<List<String>> getDynamicList() {
return dynamicList;
}
public void setDynamicList(List<List<String>> dynamicList) {
this.dynamicList = dynamicList;
}

public void setDynamicDataTableGroup(HtmlPanelGroup dynamicDataTableGroup) {
this.dynamicDataTableGroup = dynamicDataTableGroup;
}

public ValueExpression createValueExpression(String valueExpression, Class<?> valueType) {
FacesContext facesContext = FacesContext.getCurrentInstance();
return facesContext.getApplication().getExpressionFactory().createValueExpression(
    facesContext.getELContext(), valueExpression, valueType);
}
...