2017-10-10 10 views
0

Beispiel in xhtml funktioniert, weil #{row} in p:dataTable definiert ist. Wenn ich getData nicht im Kontext von p:dataTable rufe, gibt es null zurück. Siehe Values.iterateOverDatatableValues für diese Situation, in der die Methode null zurückgibt. Wie kann ich row definieren, um in meinem Kontext zu verwenden. Möglicherweise hat Datatable einige Funktionen, um über Werte zu iterieren, so dass #{row} definiert wird?Erweitern Sie EL-Kontext für einen Wert

Java:

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

XHTML #{row} in Test.getData() definiert ist:

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

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

Java ist #{row} undefined:

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

_ „hat möglicherweise Datentabelle einige Funktionen über Werte zu wiederholen?“ _ Das ist, was es tut, in der Vitrine ... Was versuchen Sie – Kukeltje

+0

Ich will Dinge zu tun, in dieser Art von exotischer Art und Weise zu erreichen, speichern EL-Ausdrücke wie '# {row.data}' in einer externen Tabelle. – Tony

+0

Nächste Frage: Warum? – Kukeltje

Antwort

0

Die Lösung zu verwenden expressionFactory war() createValueExperssion. Methode.

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