2014-09-04 33 views
0

我們希望數據表具有可收藏性,因此數據表的狀態通過URL(offset,limit,sortOrder,sortBy等)攜帶。問題是我需要從託管bean獲取數據表的實際sortBy值,並將其動態設置(不像在實現中那樣是靜態的)。從託管bean動態設置datatable sortBy屬性

我們擴展了DataTable代碼,以便sortBy的動態值可以評估。下面的代碼做的伎倆,使用bean名稱引用屬性時:

CustomDataTable.java

@Override 
protected String resolveSortField() { 
    UIColumn column = this.getSortColumn(); 
    String sortField = null; 
    ValueExpression sortVE = this.getValueExpression("sortBy"); 

    if(column == null) { 
     sortField = resolveDynamicField(sortVE); 
    } 
    else { 
     if(column.isDynamic()) { 
      ((DynamicColumn) column).applyStatelessModel(); 
      sortField = resolveDynamicField(sortVE); 
     } else { 
      sortField = resolveStaticField(sortVE); 
     } 
    } 
    return sortField; 
} 

@Override 
public String resolveDynamicField(ValueExpression expression) { 
    if(expression != null) { 
     String expressionString = expression.getExpressionString(); 
     if (expressionString.startsWith("#{")) { 
      FacesContext context = getFacesContext(); 
      ELContext eLContext = context.getELContext(); 
      ValueExpression dynaVE = context.getApplication() 
        .getExpressionFactory().createValueExpression(eLContext, expressionString , String.class); 

      String result = (String) dynaVE.getValue(eLContext); 
      if (StringUtils.isNotEmpty(result)) { 
       return result; 
      } else { 
       return resolveStaticField(expression); 
      } 
     } else { 
      return expressionString.substring(expressionString.indexOf(".") + 1); 
     } 
    } else { 
     return null; 
    } 
} 

模板:

<p:dataTable value="#{concreteBean.dataModel}" 
    var="obj" 
    selection="#{concreteBean.selected}" 
    selectionMode="single" 
    sortBy="#{concreteBean.sortBy}" 
    sortOrder="#{concreteBean.sortOrder}" 
    first="#{concreteBean.first}" 
    rows="#{concreteBean.rows}" 
    rowKey="#{obj}"> 
    ... 

但是我們需要重構,因爲複製的模板現在我們包括數據表並通過ui給它提供託管bean:參數:

... 
<ui:param name="bean" value="#{concreteBean}" /> 
<ui:include src="datatable.xhtml" /> 
... 

... 
<p:dataTable value="#{bean.dataModel}" 
    var="obj" 
    selection="#{bean.selected}" 
    selectionMode="single" 
    sortBy="#{bean.sortBy}" 
    sortOrder="#{bean.sortOrder}" 
    first="#{bean.first}" 
    rows="#{bean.rows}" 
    rowKey="#{obj}"> 
    ... 

但是,在這種情況下,動態值的計算結果爲空字符串,而不是引用bean的屬性值(sortBy的getter根本不會被調用)。

任何人都可以幫助做一些神奇的事情,所以sortBy屬性的值可以從託管bean的屬性動態設置?

回答

0

原來,我可以簡單地通過調用DataTable.getSortBy()來評估sortBy屬性,它使用StateHelper的方式與常規屬性在評估值時所用的方法相同。