8

複合コンポーネントを実装していますが、解決策が見つからない問題を見つけました。

ページ作成者が渡すことができるかどうかの属性を指定しましたが、メソッド属性 (Action へのメソッド式) を指定できませんでした。これが渡されない場合、複合コンポーネントはメソッド属性を使用しません。 composite:implementation タグで。

ここに私のコード:

<composite:interface>
    <composite:attribute name="namePrompt" required="true"/>
    <composite:attribute name="actionMethod" method-signature="java.lang.String  action()" required="false"/>
    <composite:attribute name="showComponent" default="false"/>
</composite:interface>

<composite:implementation>
    <div>
       <p:commandLink actionListener="#{cc.attrs.actionMethod}"
                      rendered="#{cc.attrs.showComponent}"
                      >
            <h:outputText value="#{cc.attrs.namePrompt}"/>    
       </p:commandLink>
    </div>
</composite:implementation>

それを使用するとき、「actionMethod」属性を指定しませんでした。このような:

<util:foo namePrompt="SomeName" showComponent="true"/>

しかし、エラーメッセージが表示されます:

javax.faces.FacesException: Unable to resolve composite component from using page using EL expression '#{cc.attrs.actionMethod}'

これを行う方法はありますか?

4

5 に答える 5

10

2 つの要素を作成しp:commandLink、パラメーターの定義に従って条件付きでレンダリングする必要があります。

<p:commandLink actionListener="#{cc.attrs.actionMethod}" rendered="#{!empty cc.getValueExpression('actionMethod') and cc.attrs.showComponent}">
  <h:outputText value="#{cc.attrs.namePrompt}"/>
</p:commandLink>
<p:commandLink rendered="#{empty cc.getValueExpression('actionMethod')}">
  <h:outputText value="#{cc.attrs.namePrompt}"/>
</p:commandLink>
于 2013-03-15T19:42:00.307 に答える
3

別の解決策は、アクション メソッドを使用して独自のコンポーネント タイプを作成することです。例:

<composite:interface componentType="myButton">
    <composite:attribute name="namePrompt" required="true"/>
    <composite:attribute name="actionMethod" method-signature="java.lang.String  action()" required="false"/>
    <composite:attribute name="showComponent" default="false"/>
</composite:interface>

<composite:implementation>
    <div>
       <p:commandLink actionListener="#{cc.action()}" rendered="#{cc.attrs.showComponent}">
          <h:outputText value="#{cc.attrs.namePrompt}"/>    
      </p:commandLink>
   </div>
</composite:implementation>

また、componentType は次のようにする必要があります。

@FacesComponent("myButton")
public class MyButton extends UINamingContainer {

    public MyButton () {
    }

    public String action() {
        MethodExpression me = (MethodExpression) this.getAttributes().get("actionMethod");
        if (me != null) {
            try {
                Object result = me.invoke(FacesContext.getCurrentInstance().getELContext(),     null);
                if (result instanceof String) {
                    return (String) result;
                }
            } catch (ValidatorException ve) {
                throw ve;
            }
        }
        return null;
    }
}
于 2014-01-22T13:56:16.240 に答える