我以一种形式声明我的转发器(比如在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)
答案 0 :(得分:0)
我期望组件在几乎相同的阶段(或至少在Invoke应用程序(aka:action,navigateTo ...)阶段之前)填充自己。但是在Invoke Application阶段的UIRepeat总是只包含一个子节点,它将用于重复的itemRenderer,数据还没有重复(我想在渲染阶段发生这种情况吗?)。
我通过这些步骤了解了一些事情:
<cc:attribute required="true"...
,即使您提供了属性,它也会抛出错误,因为uirepeat没有传递它们。 / LI>
醇>
经验教训,不要对复合组件backbean进行逻辑/验证,只是反映模型。现在我用一个可以验证自身的模型列表来驱动我的转发器,如果模型包含警告消息或任何花哨的东西我只是在复合组件中显示它。