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的屬性動態設置?