Jsf 以编程方式将sortBy属性添加到primefaces数据表列
我试图通过编程方式将Jsf 以编程方式将sortBy属性添加到primefaces数据表列,jsf,datatable,primefaces,Jsf,Datatable,Primefaces,我试图通过编程方式将sortBy属性放入primefaces数据表列中。我继承了DataTable,并使用自定义的getColumns()调用创建了自己的列 不幸的是,似乎没有干净的方法将sortBy属性插入到列中,因为该方法还不知道它所在的上下文 public List<Column> getColumns() { if (columns == null) { columns = new ArrayList<Column>();
sortBy
属性放入primefaces数据表列中。我继承了DataTable,并使用自定义的getColumns()
调用创建了自己的列
不幸的是,似乎没有干净的方法将sortBy属性插入到列中,因为该方法还不知道它所在的上下文
public List<Column> getColumns() {
if (columns == null) {
columns = new ArrayList<Column>();
String[] columnStrings = getShowColumns().split(",");
for (String columnString : columnStrings) {
Column column = getColumnByType(columnString.trim());
if (column != null) {
//here I have to add the sortBy Expression somehow,
//but there is no context to construct it from
//column.setSortBy(ValueExpression)
columns.add(column);
}
}
}
return columns;
}
public List getColumns(){
如果(列==null){
columns=newarraylist();
String[]columnStrings=getShowColumns().split(“,”);
for(字符串-列字符串:列字符串){
Column Column=getColumnByType(columnString.trim());
if(列!=null){
//这里我要加上一个肮脏的表情,
//但是没有上下文来构建它
//column.setSortBy(ValueExpression)
列。添加(列);
}
}
}
返回列;
}
对我来说似乎很明显,我错过了一些东西,但我现在迷失了方向。列
似乎在其他地方填充了值表达式
,但我找不到在哪里
我试图使用调试器检查所有代码,但我无法确定ValueExpression是在原始实现中何时生成的。感谢您的任何提示。sortBy的ValueExpression
如果列没有指定sortBy
,则不会存储在任何位置,这是您的情况。您必须为每个应可排序的列创建自己的ValueExpression
我假设您知道列类型和值,因此可以尝试以下方法:
Column column = getColumnByType(columnString.trim());
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpresion = elFactory.createValueExpression(elContext, column.getValue(), column.getType());
否则,如果您不知道类型和值:
String valueExprs = "#{data.street}"; // for example
...
Column column = getColumnByType(columnString.trim());
...
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpression = elFactory.createValueExpression( elContext, valueExprs, String.class);
现在您可以通过以下方式设置sortBy:
column.setValueExpression("sortBy", valueExpression);
请注意,使用column.setValueExpression
而不是column.setSortBy
——这样可以减少故障,大部分时间都能正常工作
希望有帮助 如果列未指定sortBy
,则sortBy
的ValueExpression
不会存储在任何位置,这是您的情况。您必须为每个应可排序的列创建自己的ValueExpression
我假设您知道列类型和值,因此可以尝试以下方法:
Column column = getColumnByType(columnString.trim());
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpresion = elFactory.createValueExpression(elContext, column.getValue(), column.getType());
否则,如果您不知道类型和值:
String valueExprs = "#{data.street}"; // for example
...
Column column = getColumnByType(columnString.trim());
...
FacesContext facesContext = FacesContext.getCurrentInstance();
ELContext elContext = facesContext.getELContext();
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory();
ValueExpression valueExpression = elFactory.createValueExpression( elContext, valueExprs, String.class);
现在您可以通过以下方式设置sortBy:
column.setValueExpression("sortBy", valueExpression);
请注意,使用column.setValueExpression
而不是column.setSortBy
——这样可以减少故障,大部分时间都能正常工作
希望有帮助 非常感谢你。我不知道我可以在单例环境下工作。我仍然不知道上下文何时以及为什么通过引用传递,但这是一个完全不同的问题。再次感谢!不客气。您可以在任何与jsf相关的“对象”中提取上下文,如Bean、PhaseListener等。但是,您必须在单独的问题中提问,才能从更有经验的用户和专业人士(如BalusC)那里获得详细答案。非常感谢。我不知道我可以在单例环境下工作。我仍然不知道上下文何时以及为什么通过引用传递,但这是一个完全不同的问题。再次感谢!不客气。您可以在任何与jsf相关的“对象”中提取上下文,如bean、phaseListener等。但是,您必须在单独的问题中提问,才能从更有经验的用户和专业人士(如BalusC)那里获得详细的答案。