JSF 2 UIRepeat。当我的复合组件嵌套在重复中时,我可以访问valueExpression而不是它的值?

时间:2010-11-25 20:29:42

标签: jsf jsf-2

我以一种形式声明我的转发器(比如在main.xhtml中):

<!--<itemRenderer:MetaFieldRenderer item="{kueditmeta.metaFieldFirst}" >
    </itemRenderer:MetaFieldRenderer>-->
    <ui:repeat var="foo" value="#{kueditmeta.metaFields}"  >
         <itemRenderer:MetaFieldRenderer item="#{foo}" >
         </itemRenderer:MetaFieldRenderer>  
    </ui:repeat>

我提交的表单在转发器中检查我的MetaFieldRenderer.xhtml复合组件,我通过调用MetaFieldRenderer()查看属性:<cc:attribute name="item" />。getModel();

在我的FacesComponent后台bean中,我公开了getModel()方法:

public MetaFieldModel getModel() {
        ELContext el = this.getFacesContext().getELContext();
        ValueExpression valExp = this.getValueExpression("item");
        Object itemValue = valExp.getValue(el);
        return (MetaFieldModel) itemValue;
    }
当我在UIRepeat中嵌套MetaFieldRenderer时,

itemValue始终为null。但是如果我取消注释转发器itemValue之外的那个不是null。

有谁知道发生了什么事?有没有更好的方法来绑定和属性我的FacesComponent?我在组件中缺少必要的实现,因此UIRepeat会更新其子项吗?

(我使用JSF 2.0.3)

1 个答案:

答案 0 :(得分:0)

我期望组件在几乎相同的阶段(或至少在Invoke应用程序(aka:action,navigateTo ...)阶段之前)填充自己。但是在Invoke Application阶段的UIRepeat总是只包含一个子节点,它将用于重复的itemRenderer,数据还没有重复(我想在渲染阶段发生这种情况吗?)。

我通过这些步骤了解了一些事情:

  1. 恢复视图阶段带回一个普通的UIRepeat,其子节点在xhtml中声明。没有UIRepeat没有填充任何东西,只有itemRenderer在那时没有任何值。
  2. 要查看其子项(如果是复合组件)当时没有绑定任何内容,请使用必需的属性<cc:attribute required="true"...,即使您提供了属性,它也会抛出错误,因为uirepeat没有传递它们。 / LI>

    经验教训,不要对复合组件backbean进行逻辑/验证,只是反映模型。现在我用一个可以验证自身的模型列表来驱动我的转发器,如果​​模型包含警告消息或任何花哨的东西我只是在复合组件中显示它。