beforePageLoadまたはafterPageLoadで、 compositeDataへの参照を使用してSSJS変数を作成します。
<xp:this.beforePageLoad>
<![CDATA[#{javascript:
var hlp=compositeData;
}]]>
</xp:this.beforePageLoad>
これにより、レンダリングフェーズ中にPropertyMapにアクセスできます。プロパティテストがある場合は、次の方法でアクセスできます。
<xp:this.afterRenderResponse>
<![CDATA[#{javascript:
print( hlp.test );
}]]>
</xp:this.afterRenderResponse>
編集:
これは、ページが開かれている場合にのみ機能します(pageLoad)。ページを更新すると、これは機能しません。部分的な更新で実行する必要がある場合は、次のようにする必要があります。
まず、カスタムコントロールにIDを追加する必要があります。
<xc:ccWithId test="I am your property" id="ccWithId" />
これにより、 getComponent()を使用して通常のコンポーネントとしてカスタムコントロールにアクセスできます。これで、必要な変数を保持するカスタムコントロールのイベントでコンポーネントのpropertyMapにアクセスできます。
<xp:this.beforeRenderResponse>
<![CDATA[#{javascript:
var cmp:com.ibm.xsp.component.UIIncludeComposite = getComponent("ccWithId");
print("Value of 'test' -> " + cmp.getPropertyMap().getString("test") )
}]]>
</xp:this.beforeRenderResponse>
xpages-noobによる編集:上記の例は、静的カスタムコントロールプロパティに対して正常に機能します。ただし、プロパティが計算される場合、プロパティマップのさまざまなget関数は、値自体ではなく、値バインディングオブジェクトを返します。したがって、回避策として次の関数を使用できます。
var thisData:com.ibm.xsp.binding.PropertyMap=getComponent("ccWithId").getPropertyMap();
function getPara(key) {
var x=thisData.get(key);
if (@Ends(typeof(x),"ValueBinding")) return x.getValue(facesContext);
else return x
}
たとえば、プロパティ "test"を取得する場合は、getPara( "test")を呼び出します。戻り値はcompositeData.testと同じである必要があります。