0

我有一个复合组件:

<cc:interface>
    <cc:attribute name="value" required="true">
</cc:interface>
<cc:implementation>
    <h:outputText value="#{cc.attrs.value}"/>
    <h:commandButton action="#{internalBean.someAction}"/>
</cc:implementation>

我想通过#{internalBean.someAction}更改#{cc.attrs.value},换句话说:通过我的复合组件的方法更改用户定义(外部)bean的(字符串)值。我该怎么做?

谢谢。

4

3 回答 3

3

更新

我能想到的一种方法是使用<f:setPropertyActionListener>.

<cc:interface>
    <cc:attribute name="value" required="true"/>
</cc:interface>
<cc:implementation>
    <h:outputText value="#{cc.attrs.value}"/>
    <h:commandButton action="#{internalBean.someAction}">
        <f:setPropertyActionListener value="#{cc.attrs.value}" target="#{internalBean.stringValueFromExternalBean}"/>
    </h:commandButton>
</cc:implementation>
于 2013-07-15T20:55:27.153 回答
2

但是没有必要使用 StringBuilder:

 <composite:interface>
        <composite:attribute name="value" required="true"/>
    </composite:interface>
 <cc:implementation>
 ...
 <f:setPropertyActionListener target="#{cc.attrs.value}" value="#{internalBean.value}"/>
...
</cc:implementation>

其中值是普通字符串。它工作正常!

于 2013-07-17T07:30:11.627 回答
0

我终于找到了有史以来最好的解决方案。它立即作为一个普通组件工作——每次更改都会更新外部 bean 属性:

public void setValue(String value) {
    this.value = value;
    FacesContext facesContext = FacesContext.getCurrentInstance();
    ELContext elContext = facesContext.getELContext();
    ValueExpression valueExpression = facesContext.getApplication().getExpressionFactory()
            .createValueExpression(elContext, "#{cc.attrs.value}", String.class);
    valueExpression.setValue(elContext, value);
}
于 2013-08-04T18:41:21.957 回答