Will man auf die DataContext-Variablen einer XPage zugreifen, gibt es die Möglichkeit, die Methode getDataContexts() zu verwenden, die für jede UIComponent existiert. Die Methode liefert eine java.util.List zurück, die sich z.B. in einen Array verwandeln lässt, um auf die einzelnen Mitglieder zu zugreifen. Die Mitglieder wiederum sind vom Typ com.ibm.xsp.model.DataContext, mit getVars() lässt sich auf den Inhalt der jeweiligen Variable zugreifen.
Hier ein Beispiel:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.dataContexts>
<xp:dataContext var="dcVar" value="1" />
</xp:this.dataContexts>
<xp:text escape="true" id="computedField1">
<xp:this.value>
<![CDATA[#{javascript:
var lc:java.util.List = view.getDataContexts();
var dc:com.ibm.xsp.model.DataContext = lc.toArray()[0];
dc.getVars().toString()
}]]>
</xp:this.value>
</xp:text>
</xp:view>
[Fett: Die DataContext-Variable // Rot: Die UIComponent, an der die Variable „hängt“]
In diesem Beispiel ist die Variable direkt der UIViewRoot-Komponente zugeordnet worden. Ist die Variable an einer anderen UIComponent (z.B. einem Custom Control), muss auf den DataContext dieser Komponente zugegriffen werden. Ist also eine DataContext-Variable im Custom Control definiert, nicht jedoch in der eigentlichen XPage, so würde ein view.getDataContexts() nichts zurück liefern.
Um auf die Variablen eines Custom Controls zuzugreifen, muss also entweder der komplette Komponentenbaum durchlaufen werde, oder das Custom Control muss mit id definiert sein, um referenziert werden zu können.
Hier das Custom Control ccDCVar:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:this.dataContexts> <xp:dataContext var="dcVarCC" value="2" /> </xp:this.dataContexts> </xp:view>
Die XPage, die auf das Custom Control zugreift, kann dann wie folgt aufgebaut sein:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="http://www.ibm.com/xsp/custom"> <xc:ccDCVar id="cc1"></xc:ccDCVar> <xp:text escape="true" id="computedField1"> <xp:this.value> <![CDATA[#{javascript: var lc:java.util.List = getComponent("cc1").getDataContexts(); var dc:com.ibm.xsp.model.DataContext = lc.toArray()[0]; dc.getVars().toString() }]]> </xp:this.value> </xp:text> </xp:view>
[Fett: Zugriff auf die UIComponent mittels getComponent() // Rot: Id des Custom Controls]