2011-12-13 40 views
1

我需要您的幫助。我使用的是JSF 2.0,我有一個數據表組件。數據表中的一列是動作列,我需要創建一個包含不同類型的動作源組件的工具欄,如命令按鈕,鏈接等。動作源的類型在運行時確定,動作源的數量也在運行。我怎麼能在JSF 2.0實現這個JSF中的動態列Datatable JSF2.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> 

我感謝你的幫助

Prajeesh奈爾

回答

2

是有區別的JSF中的構建時間和呈現時間。像<ui:repeat>這樣的構建時標籤可以動態創建新組件,但它們只能使用構建時可用的數據。

但是,使用Java,您也允許以編程方式更改組件樹,但這也不能隨時發生。安全的時刻是preRenderViewEvent,它比構建時刻(restore view階段晚)晚一點,你應該擁有你需要的所有數據。

在此事件的事件處理函數內,您可以引用您綁定到支持bean的工具欄,並以編程方式向其添加列。

例子可見:

請注意,如果您的支持bean是@ViewScoped,你最好不要使用綁定,但使用手動查找來代替。這是由於JSF中的視圖範圍和綁定組件存在一些錯誤。

+0

1.範圍可以由最終用戶來定義上創建動態列,因爲它是一個定製的解決方案。截至目前,它是一個ViewScope。如果你看到可能是最後一列,則rowItem是可變數據var。所以我需要獲取特定於該行的操作列。每行都會有所不同 –

+1

如果您需要動態列,請使用arjan的解決方案。如果您還需要每行動態內容,請放入多個組件並有條件地呈現它們。數據表中的每行不能有任意的組件,因爲行並不真正存在(它是使用不斷變化的數據呈現的列)。如果你需要,可以看看一些datagrid組件。 –

0

下面的代碼將選定的國家的基礎

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); 
}