私は、カスタム コントロールでカスタム プロパティをうまく利用しています。カスタムメソッドのようなものはありますか? CCで何かをしたいとします。良い例は、ダイアログ ボックス拡張機能の show メソッドです。内部に拡張ダイアログを含む cc がある場合、エンド ユーザー プログラマーを拡張ページの Shoe メソッドから隔離する Show メソッドをカスタム コントロールに含める必要があります。
とにかくこれを行うことはありますか?
私は、カスタム コントロールでカスタム プロパティをうまく利用しています。カスタムメソッドのようなものはありますか? CCで何かをしたいとします。良い例は、ダイアログ ボックス拡張機能の show メソッドです。内部に拡張ダイアログを含む cc がある場合、エンド ユーザー プログラマーを拡張ページの Shoe メソッドから隔離する Show メソッドをカスタム コントロールに含める必要があります。
とにかくこれを行うことはありますか?
実行時に、すべてのカスタム コントロール要素がUIIncludeCompositeクラスのインスタンスになります。そのため、特定のコントロール インスタンスに対して呼び出すことができる組み込みメソッドは多数ありますが、カスタム プロパティとは対照的に、カスタム メソッドを指定する方法はありません。
ただし、目的の結果を得るには、少なくとも 2 つの方法があります。
カスタム コントロールをコンポーネントに変換します (この NotesIn9 エピソードこのプロセスへの最も簡単なアプローチを説明しています)。Designer が生成したクラスを、NSF をビルドするたびにオーバーライドされないクラスに移行すると、次のビルドでそれらが再び消去されることを心配することなく、カスタム メソッドを追加できます。カスタム コントロールは基本的に、「複合コンポーネント」の JSF 2.0 概念の IBM による実装にすぎないため、既存のカスタム コントロールと同じ動作を持ち、カスタム動作もサポートするコンポーネントをゼロから作成することもできます。どちらの方法でも、OSGi ライブラリを作成する必要は必ずしもないことに注意してください。これらのコンポーネントは、NSF で直接定義できます。さまざまなファイルをそれぞれにコピーすることなく、複数の NSF でそれらを再利用したい場合にのみ、それらをライブラリにプッシュする必要があります。
コントロールのカスタム プロパティに、API オブジェクトを受け入れる 1 つのプロパティを含めます。つまり、定義するカスタム メソッドをサポートする任意のオブジェクト (たとえば、Java クラスまたは SSJS オブジェクト) を作成し、そのオブジェクトをコントロールに渡すことができます。その後、CC のプロパティ マップを介してオブジェクトのハンドルを取得することで、これらのメソッドを呼び出すことができます。
例えば:
<myCC id="myCustomControl" API="#{someObject}" />
#{someObject} が show() メソッドを含むことを解決すると仮定すると、コントロールに渡されたインスタンスのハンドルを取得することで、そのメソッドを呼び出すことができます。
var cc = getComponent("myCustomControl");
var ccProperties = cc.getPropertyMap();
var ccAPI = ccProperties.get("API");
ccAPI.show(cc);
上記の例では、実際のカスタム コントロールを show() メソッドに渡しています。これは、オブジェクト自体が渡されたカスタム コントロールを認識していないためです。そのため、たとえば、レンダリングされたプロパティを切り替えるためにそのメソッドがその子のハンドルを取得する必要がある場合、そのコンテキストを決定する別の方法が必要になります。
別の解決策は、カスタム コントロール インスタンスの ID を渡す必要がある関数 (カスタム コントロール メソッド) を提供するカスタム コントロールに JavaScript ライブラリを含めることです。
オブジェクトを渡すことによるティムのソリューションは、それに対する優れたソリューションです。
頭に浮かんだのは、コントロールのレンダリングされたプロパティに似たプロパティを簡単に作成できることです。値を渡し、カスタム コントロール内でその値に基づいて何かを実行します。true の場合はダイアログを表示し、そうでない場合は非表示にします。実行時に XPage でこの値を変更し、コントロールを部分的に更新すると、これによってロジックが再実行され、コントロールが表示されます。