8

複数のアクションリスナーを使用して、さらに処理する前に 2 つのバッキング Bean の状態を設定したい

最初の方法:

<p:commandButton process="@this" >
   <f:attribute name="key" value="#{node.getIdTestGroup()}" />
   <f:actionListener binding="#{testController.nodeListener}" />
<f:actionListener binding="#{testDeviceGroupController.prepareCreate}" />
</p:commandButton>

例外があります:

WARNING: /testGroup/List.xhtml @26,88 binding="#{testController.nodeListener()}": メソッド nodeListener が見つかりません javax.el.E​​LException: /testGroup/List.xhtml @26,88 binding="#{ testController.nodeListener()}": メソッド nodeListener が見つかりません

2 番目の方法:

<p:commandButton process="@this" >
    <f:attribute name="key" value="#{node.getIdTestGroup()}" />
    <f:actionListener binding="#{testController.nodeListener(event)}" />
    <f:actionListener binding="#{testDeviceGroupController.prepareCreate(event)}" />
</p:commandButton>

イベントは nodeListener および prepareCreate メソッドで null です

どうすれば正しいですか?

4

2 に答える 2

13

裸の直感とランダムな連想を使って推測し、仕組みを推測するという伝統的なアプローチをあなたが促進しているように見えます:-)

f:actionListener任意のメソッドではなく、オブジェクト全体をオブザーバーとして追加することしかできません。typeattribute を使用してクラス名 (JSF によってインスタンス化されます) を指定するか、attribute を使用bindingして自分で作成したオブジェクトのインスタンス (メソッドではありません!) を指定できます。オブジェクトは を実装する必要がありますjavax.faces.event.ActionListener

2 番目の試行 ( ) は多くのレベルで間違っていますが、重要なのは、アクションを処理するためではなく、インスタンスtestDeviceGroupController.prepareCreate(event)を作成するためにメソッドが呼び出されることです。Actionlistener

いくつかのオプションがあります。

  • 最も健全なもの: 各ターゲット メソッドを呼び出すメソッドを作成するだけです。それらは異なる Bean にあるため、一方を他方に注入できます。
  • それがうまくいかない場合は、リスナー オブジェクトを作成するメソッドを作成できます。

このような:

public ActionListener createActionListener() {
    return new ActionListener() {
        @Override
        public void processAction(ActionEvent event) throws AbortProcessingException {
            System.out.println("here I have both the event object, and access to the enclosing bean");
        }
    };
}

次のように使用します。

<h:commandButton>
    <f:actionListener binding="#{whateverBean.createActionListener()}"/>            
</h:commandButton>
于 2013-05-04T12:27:53.370 に答える
0

属性値は、メソッドではなく、インターフェイスをbinding実装するオブジェクトを指す必要があります。ActionListener

f:actionListenerbindig属性のドキュメントから:

javax.faces.event.ActionListener を実装するオブジェクトに評価される値バインディング式。

同様の問題がここで議論されました。

于 2013-05-04T12:19:58.143 に答える