jsf 2.0复合组件 - 如何修改外部bean /属性

时间:2010-05-27 13:42:01

标签: jsf components custom-component jsf-2 myfaces

我正在学习JSF 2并使用简单的自定义组件。 想象一下,启用了ajax的自定义组件有两个inputText字段:

...
<h:body>
  <composite:interface>
    <composite:attribute name="domId" required="true" />
    <composite:attribute name="value" required="true" />
  </composite:interface>
  <composite:implementation>
    <h:inputText id="code" value="#{cc.attrs.value}">
    <f:valueChangeListener binding="#{domBean}" >    
    </f:valueChangeListener>
      <f:ajax event="valueChange" execute="@this"
      render="name"/>  
    </h:inputText>

        <h:inputText id="name" value="#{domBean.name}" disabled="true">
    </h:inputText>
  </composite:implementation>
...

使用该组件的页面如下所示:

...
<h:body>
  <h:form>
  <dom:domain domId="100" value="#{testCtrl.code}"/>
  </h:form>
</h:body>
...

定义domBean的类中有趣的方法如下:

  public void processValueChange(ValueChangeEvent event)
      throws AbortProcessingException
  {
    String code = (String) event.getNewValue();
    UIInput input= (UIInput) event.getSource();
    name = resolveCode(code); //some magic transformation
    if (name != null)
      input.setValue(code); //just want to set the "entered" / "validated" text
   }

我希望input.setValue(code)会设置inputText值,这是延迟表达式“#{cc.attrs.value}”,它由“父”链接到#{testCtrl.code}页。 不幸的是,testCtrl.code永远不会填入输入的值。

我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:1)

最后,经过数小时的跟踪,我意识到这是myfaces 2.0.0实现中的一个错误。 使用最近的2.0.1快照,它可以工作。

有关详细信息,请查看apache跟踪器中的问题: https://issues.apache.org/jira/browse/MYFACES-2675