我有这样的复合(X):
<composite:interface>
<composite:attribute name="textValue" />
<composite:attribute name="textValueChangeListner"
method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)" />
<composite:implementation>
<ice:inputText
value="#{cc.attrs.textValue}"
valueChangeListener="#{cc.attrs.textValueChangeListner}"/>
在JSF页面中,我有类似的内容:
<X:iText
textValue="#{cardBean.getCardValue}"
textValueChangeListner="#{cardHandler.cardValueChanged}" />
上面的代码工作正常。但是当没有“textValueChangeListner”从JFace页面传递给复合时,它不起作用;即:
<X:iText
textValue="#{cardBean.getCardValue}" />
我得到的错误: [javax.enterprise.resource.webcontainer.jsf.lifecycle]无法使用EL表达式'#{cc.attrs.textValueChangeListner}'来解析使用页面的复合组件:javax.faces.FacesException:无法使用页面使用页面解析复合组件EL表达式'#{cc.attrs.textValueChangeListner}'
在我的场景中,页面开发人员可能会或可能不会向复合组件提供“textValueChangeListner”。 我怎样才能做到这一点?
答案 0 :(得分:2)
这里有两个选项:第一个是简单方法,如果用户没有提供Value Change侦听器,只需渲染另一个输入文本而不使用valueChangeListener。
<ice:inputText
value="#{cc.attrs.textValue}"
valueChangeListener="#{cc.attrs.textValueChangeListener}"
rendered="#{!empty cc.attrs.textValueChangeListener}"/>
如果您需要在任何情况下都有valueChangeListener,那么为该属性应用默认值:
<composite:attribute name="textValueChangeListener"
method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
required="false"
default="#{cc.valueChangedListener}" />
为此,您需要将复合组件绑定到辅助bean。您需要通过其接口声明定义组件的支持bean类型,如下所示:
<composite:interface componentType="yourComponentBean">
<composite:attribute name="textValueChangeListener"
method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
required="false"
default="#{cc.valueChangedListener}" />
</composite:interface>
这是yourComponentBean,它实现了默认的ValueChangedListener。
@FacesComponent("yourComponentBean")
public class YourComponentCC extends UINamingContainer
{
public void valueChangedListener(ValueChangeEvent ev)
{
....
}
}
Btw cc
是EL中用于访问在组件中定义为componentType的辅助bean的快捷方式。因此cc.valueChangedListener
会调用valueChangedListener
类中定义的YourComponentCC
方法。
答案 1 :(得分:2)
将属性重命名为valueChangeListener
并使用targets
属性
<composite:attribute name="valueChangeListner"
method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)"
targets="text" />
其中text
是目标输入组件的ID,
<ice:inputText id="text" ... />
并从中删除valueChangeListener
。