2017-10-10 77 views
0

xhtml中的示例工作,因为#{row}p:dataTable中定义。如果我拨打getData而不是p:dataTable,它将返回null。对于这种情况,请参阅Values.iterateOverDatatableValues,其中方法返回null。我如何定义row以在我的上下文中使用。可能有数据可用于迭代值的一些函数,以便定义#{row}展开某些值的EL-Context

爪哇:

@Named 
@SessionScoped 
class Test { 
    public Object getData() { 
    return Faces.evaluateExpressionGet("#{row.someProperty}"); //The String "#{row.someProperty}" comes from a collection. 
    } 
} 

XHTML #{row}Test.getData()定义:

<p:dataTable value="#{bean.values}" var="row"> 

    <p:column> 
     <h:outputText value="#{test.data}" /> 
    </p:column> 
</p:dataTable> 

爪哇,#{row}未定义:

class Values { 
    @Inject 
    Test test; 

    public void iterateOverDatatableValues(){ 
    DataTable dt = Components.findComponent("datatableId"); 
    for (Object o : dt.getValues()){ 
     test.getData(); // <---- NULL because #{row} is not defined. 
    } 
    } 
} 
+0

_“可能有一些数据表功能遍历值?” _这就是它在橱窗......你到底想达到处事这种奇特的方式 – Kukeltje

+0

我要救在某些外部表中,EL表达式像'#{row.data}'。 – Tony

+0

下一个问题:为什么? – Kukeltje

回答

0

的解决方案是使用expressionFactory()createValueExperssion。方法。

private void setRowEL(Object o) { 
    ELContext elContext = Faces.getELContext(); 
    ExpressionFactory expressionFactory = Faces.getApplication().getExpressionFactory(); 
    ValueExpression aliasValueExpression = expressionFactory.createValueExpression(elContext, "#{row}", MyValue.class); 
    aliasValueExpression.setValue(elContext, o); 
}