アプリケーションの 1 つで以下を使用して、カスタム コントロールに関数を渡しています。
1) カスタム コントロールで、アクション ボタンで実行される関数を保持するプロパティを追加します。私は「querySave」と呼びます。プロパティ タイプは「javax.faces.el.MethodBinding」である必要があります。エディターは「メソッド バインディング エディター」である必要があります。
2)。この例のカスタム コントロールのアクション ボタンの背後にあるコードを次に示します。
if (compositeData.querySave) if (!compositeData.querySave.call()) return;
currentDocument.save();
これは、「querySave」プロパティで関数が定義されている場合は、それを呼び出します。関数が false を返す場合、ドキュメントを保存しないでください。
3) アクション ボタンに必要な処理を行う SSJS 関数を定義します。私は通常、SSJS ライブラリに配置します。XPage が関数にアクセスできることを確認してください。
4) このコントロールを含む XPage で、ステップ 1 で作成したプロパティー (この例では querySave) のエディターを使用して、ステップ 3 で作成した関数の名前を入力します。重要: 括弧やパラメーターを追加しないでください。関数名を入力すると、アクション ボタンをクリックしたときではなく、ロード時に関数が実行されます。また、エディターにコードを直接追加しないでください。関数名だけを追加してください。このエディタのコードはロード時にも実行されます。
Experts Exchange で回答してくれた Bill Hanson に感謝します。
--
アップデート:
問題の SSJS 関数が validateDocument と呼ばれるカスタム プロパティを持つカスタム コントロールの具体的な例を次に示します。
<xc:component_buttons>
<xc:this.validateFunctionName><![CDATA[#{javascript:validateDocument}]]></xc:this.validateFunctionName>
</xc:component_buttons>
関数を呼び出すカスタム コントロールのボタンの例を次に示します。
<xp:button id="submit" value="Save">
<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
<xp:this.action>
<xp:actionGroup>
<xp:this.condition><![CDATA[#{javascript:
if (compositeData.validateFunctionName) {
compositeData.validateFunctionName.call();
}}]]>
</xp:this.condition>
<xp:save></xp:save>
</xp:actionGroup>
</xp:this.action>
</xp:eventHandler>
</xp:button>