1

我有一个像这样的复合(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 页面传递给组合时,它不起作用;IE:

<X:iText
textValue="#{cardBean.getCardValue}" /> 

我得到的错误:[javax.enterprise.resource.webcontainer.jsf.lifecycle] 无法通过使用 EL 表达式“#{cc.attrs.textValueChangeListner}”的页面解析复合组件:javax.faces.FacesException:无法解析复合组件从使用 EL 表达式 '#{cc.attrs.textValueChangeListner}' 的页面

在我的场景中,页面开发人员可能会或可能不会向复合组件提供“textValueChangeListner”。我怎样才能做到这一点?

4

2 回答 2

2

您在这里有两个选择:第一个是简单的方法,如果用户没有提供值更改侦听器,则只需呈现另一个输入文本而没有 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>

这是实现默认 ValueChangedListener 的 yourComponentBean。

@FacesComponent("yourComponentBean")
public class YourComponentCC extends UINamingContainer
{
    public void valueChangedListener(ValueChangeEvent ev)
    {
       ....
    }
}

Btwcc是 EL 中访问在组件中定义为 componentType 的支持 bean 的快捷方式。所以cc.valueChangedListener会调用类中valueChangedListener定义的方法YourComponentCC

于 2013-01-31T09:39:32.957 回答
2

将属性重命名为valueChangeListener并使用targets属性,

<composite:attribute name="valueChangeListner"
                     method-signature="void valueChanged(javax.faces.event.ValueChangeEvent)" 
                     targets="text" />

其中text是目标输入组件的 ID,

<ice:inputText id="text" ... />

valueChangeListener并从中删除。

于 2013-01-31T11:37:39.997 回答