2012-04-27 3 views
0

まず、私の無知と無能を許してください。検索エンジンを使用してください(私は長い間頻繁に検索しましたが、この問題に対する満足な答えは見つかりませんでした)。コンポーネント内のcommandButtonにactionListenerメソッドを渡します。

私はアクションリスナー互換方式の実装豆があります。そして、

@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コンポーネントに引数を指定してメソッドを渡すことは一般的に可能ですか?

私は、上記の戦略を変更することで一般的な問題を解決する可能性のある解決策があることを望みますか、または何か素敵で違うものを使用することができます。(一般的には、ハックや回避策を使用したくないフレームワークによって)。

誰かが私に方法を指す時間を見つけることに感謝!この質問が既に存在する場合は、関連する投稿にアクセスしてこれを削除するとよいでしょう。次

答えて

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を使用しました。

+0

ありがとうNikita!これはそれを行う良い方法だと思われる! myAction = "#{myBean.myAction}" 'それはメソッドのためではなく_attribute_を常に探していて、デバッグのために' myAction = "を試してみました。 #{myBean.myAction(event)} "'、呼び出しがメソッドに渡されました。しかし、 'myAction(ActionEvent event){' 'event'はnullでした...私は式コンテキストから' event'をアクセス/渡すことができますか?とにかくありがとう! –

+0

http://docs.oracle.com/javaee/6/javaserverfaces/2.1/docs/vdldocs/facelets/composite/actionSource.htmlを参照してください。 ''を追加して、このように使用することができます: '' –

関連する問題