0

最初に、私の無知と無能さを許してください。検索エンジンを使用してください (長い間、頻繁に検索しましたが、この問題に対する満足のいく答えは見つかりませんでした)。

アクションリスナーと互換性のあるメソッドを実装する Bean があります。

@ManagedBean(name = "myBean")
@ViewScoped
class Bean{
    public String myAction(ActionEvent event){
        ... = event.getComponent().getAttributes().get("something");
    }
}

次に、次のような jsf コンポーネントがあります。

<composite:interface>
    <composite:attribute name="actionBean" required="true"/>
    <composite:attribute name="actionMethod" method-signature="void myAction(javax.faces.event.ActionEvent)" />
</composite:interface>
<composite:implementation>
        <h:form>
            <p:commandButton actionListener="#{cc.attrs.actionBean[cc.attrs.actionMethod]}">
                <f:attribute name="something" value="somevalue" />
            </p:commandButton>
        </h:form>
</composite:implementation>

これは次のように呼ばれます。

<namespace:myComponent actionBean="#{myBean}" actionMethod="myAction" />

この呼び出しが機能していないことはわかっています。どうすれば正しく実行できるのでしょうか。

私の主な意図は、ボタンを含む比較的一般的な jsf コンポーネント (後で再利用できるようにするとよいでしょう) を用意することです。このボタンをクリックすると、オブジェクトを渡したいです(単純な文字列ではありません!文字列の場合は、使用action="..."して を介して渡しますf:param)。メソッドを使用してactionListener、 を介してオブジェクトを取得しますevent.getComponent().getAttributes().get("something")

void myAction(javax.faces.event.ActionEvent)署名は、関連するメソッドをコンポーネントに渡すのを壊す問題だと思いますね。一般に、任意の引数を使用してメソッドを jsf コンポーネントに渡すことは可能ですか (そうであれば、どのように)?

したがって、上記の戦略を変更することで一般的な問題を解決するための解決策があることを願っています。または、何か素敵で異なるものを使用することもできます (一般的に、ハックや回避策を使用することは好まないが、フレームワークが意図するものを使用することを好みます)。 .

誰かが私に道を示す時間を見つけてくれたらありがとう! この質問が既に存在する場合は、関連する投稿にアクセスして削除してください。

4

1 に答える 1

3

以下を試してください:

<namespace:myComponent myAction="#{myBean.myAction}"/>

複合コンポーネント:

<composite:interface>
    <composite:attribute name="myAction" 
                         required="true" 
                         method-signature="void myAction(javax.faces.event.ActionEvent)"
                         targetAttributeName="actionListener"/>
</composite:interface>
<composite:implementation>
    <h:form>
        <p:commandButton id="myAction">
            <f:attribute name="something" value="somevalue" />
        </p:commandButton>
    </h:form>
</composite:implementation>

composite:attributeのドキュメントを確認してください。リスナーを複合コンポーネントに渡すオプションがいくつかあります。これに使いtargetAttributeNameました。

于 2012-04-27T10:57:50.680 に答える