我有一个复合组件:
<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的(String)值。我怎么能这样做?
感谢。
答案 0 :(得分: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>
答案 1 :(得分: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>
其中值是普通字符串。它工作正常!
答案 2 :(得分: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);
}