0

メソッド式をカスタム コンポーネントに渡す方法の最小限の例を探しています。次のことを試しましたが、コンポーネントの担当セッターが呼び出されません。

私の見解のための豆:

public String bar(){
    //do stuff
    return "";
}


私の見解:

<my:comp foo="#{bean.bar}" />


私のコンポーネントのBean:

private static final String FOO = "foo";
public void setFoo(MethodExpression me){
    //never called
    getStateHelper().put(FOO, me);
}

public MethodExpression getFoo(){
    //actually gets called
    return (MethodExpression) getStateHelper().get(FOO);
}


コンポーネント レンダラー内でcomponent.getFoo()、NPE を呼び出して取得します。

4

1 に答える 1

2

ActionSource2インターフェイスを実装する必要があります。

@FacesComponent(MyComponent.COMPONENT_TYPE)
public class Mycomponent extends UIComponentBase implements ActionSource2 {
    // ...
}

または、ジョブを繰り返す必要がないように、これらすべてのメソッドが既に正しい方法で実装UICommandされているクラス (コンポーネントでも使用される)から拡張する方が簡単です。<h:commandXxx>ActionSource2

@FacesComponent(MyComponent.COMPONENT_TYPE)
public class Mycomponent extends UICommand {
    // ...
}

どちらの方法でも、アクション リスナーを使用action="#{some method expression}"したり、アタッチしたりすることができます。属性名の名前は変更できないことに注意してくださいaction。それは本当にする必要がありますaction

このようなカスタム コンポーネントのオープン ソースの例はOmniFaces<o:commandScript>です。ソースコードはこちらから入手できます。

于 2013-09-05T12:20:12.907 に答える