0

私がやりたいのは、ロードする必要があるかどうかを独自に決定するカスタムコントロールを作成することです。そこで、カスタムコントロールのロードされたプロパティを確認しましたが、期待どおりに機能しません。少なくともこのプロパティを無視しているようです。デモンストレーションのために、小さなテストコントロールをまとめました。

<?xml version="1.0" encoding="UTF-8"?>
 <xp:view xmlns:xp="http://www.ibm.com/xsp/core" pageTitle="Test" loaded="false">
   This is a test custom control.
 </xp:view>

ロードされたプロパティがfalseに設定されている場合でも、コントロールは常に表示されます。私ができることは、カスタムコントロールをページに配置し、そこにロードされたプロパティを設定することです。これは問題なく機能しますが、コントロールを使用するたびにそのプロパティを設定する必要はありません。コードをコントロールに入れて、ロードする必要があるかどうかを確認したいと思います。

私は何かを逃していますか?

はい、すべてをコントロールのdiv内に配置し、divをロードしないことはできますが、ロードする必要がない場合は、コントロールをまったくロードしないほうがよいでしょう。

4

1 に答える 1

1

ロードされた属性がルート要素で利用できる理由は完全にはわかりません。なぜなら、そのレベルで評価することは本質的に不可能だからです。

コンポーネントの表現がコンシューマーに送信されるかどうかを決定するrenderedとは対照的に、loadedは、コンポーネントが作成されるかどうかを決定します。したがって、renderedがfalseの場合、表示されません...ロードされたfalseの場合、存在すらしません。ビュータグの属性を評価するには、コンポーネントが存在している必要があります。存在しないように指示するにはコンポーネントが存在する必要があるため、コンポーネントの存在を停止するには遅すぎます。

そのため、loadedを使用してコントロール全体を抑制するには、コントロール参照に属性を設定する必要があります。つまり、コントロールをXPage(または別のカスタムコントロール)に追加するときは、コントロールのタグにロードされた式を設定します。falseと評価された場合、コントロールはロードされません。

これらはすべてJavaとして実行されることになります...クラスインスタンスの構築をブロックすると、構築されるべきかどうかを尋ねるクラスインスタンスがありません。逆に、クラスインスタンスを作成する場合は、それが存在する必要があるかどうかを尋ねます...遅すぎると、すでに存在します。カスタムコントロールがそのコンテンツが存在するかどうかのロジックを所有する必要がある場合は、単一の子コンテナーのロードされた属性でそのロジックを指定することが「正しい」アプローチです。

于 2013-03-18T21:20:22.077 に答える