3

いくつかの入力フィールドをバンドルする複合コンポーネントがあります。コンポーネントはページで複数回使用され、これらのコンポーネントの別の値をコピーするためのボタンが含まれています。このためには、clientId を介してこれらの兄弟の 1 つにアクセスする必要があります。

<f:ajax execute=":XXX:siblingId" render="...">

私の問題は、この ID の作成にあります。:form:foo:bar:parent:child兄弟の名前があり、それがコピー ボタンを含むコンポーネントと同じ名前付けコンテナーに配置されていることを確認できますが、ネスト階層全体を制御できないため、form:parent:child. したがって、基本的には、現在の複合コンポーネントのプレフィックスを取得しますが、コンポーネント自体の ID を取得せずに、コピー元のコンポーネントの ID を添付します。

これは、次の質問に似ています。

@parentただし、どちらの回答も、や などの PrimeFaces 固有の機能を利用widgetVarしていますが、これは私のプロジェクトには当てはまりません。

EL の暗黙的なオブジェクトを試すとき、私は基本的に 2 番目の質問のポスターと同じことを試しました - 同じ結果:cc.parent.clientIdは常に空です。cc.namingContainer.clientId残念ながら、2つの組み合わせも試してみましたが、成功しませんでした。parent特に期待通りに動かないという事実は私を混乱させます...

だから:複合コンポーネントの名前付けコンテナを含む「パス」にアクセスするためのコンポーネントライブラリに依存しない方法はありますか?特に、オブジェクトはどのように機能parentするはずですか? いつ使用できるか、いつ使用できないか?

PS: コンポジットの完全な clientId を使用してから、実際の ID を でトリミングすることを考えてfn:splitいましたが、より直接的な方法があれば喜んで使用します。

4

1 に答える 1

6

最も近い親複合コンポーネントを返す#{cc.parent}resolves 。つまり、複合コンポーネントがそれ自体で別の複合コンポーネントにネストされている場合にUIComponent#getCompositeComponentParent()のみ、非を返します。null

#{cc.namingContainer}単にそれ自体を参照し、:#{cc}で指定されているように完全に準拠しています。UIComponent#getNamingContainer()

「this」で始まり、祖先で最も近いコンポーネントである、NamingContainerまたはnull何も見つからない場合は返します。

つまり、複合コンポーネントは暗黙的NamingContainerにそれ自体を実装します。

したがって、残念ながらあなたの試みはうまくいきません。また、具体的な機能要件を達成するための「標準API」の方法もわかりません。が解決しないCompositeComponentAttributesELResolver原因は、最終的に必要なものです。#{cc.parent}UIComponent#getParent()

ただし、コンポジットのカスタムUIComponent実装を提供して、一意の名前を持つ追加のゲッターを追加し、それを適切にに委任することができますUIComponent#getParent()

キックオフの例は次のとおりです。

@FacesComponent("myComposite")
public class MyComposite extends UINamingContainer {

    public UIComponent getParentComponent() {
        return super.getParent();
    }

}

複合インターフェースで次のように登録すると、次のようになります。

<cc:interface componentType="myComposite">

その後、あなたが使用できるようになります

#{cc.parentComponent.clientId}

実際の親のクライアントIDを取得しますUIComponent

最終的には、次の構成を使用して兄弟を参照できるようになります。

process=":#{cc.parentComponent.clientId}:siblingId"
于 2012-11-01T18:10:25.997 に答える