我以一种形式声明我的中继器(例如在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().getModel()查看一个属性:<cc:attribute name="item" />;
在我的FacesComponent bean中,我公开了getModel()方法:
public MetaFieldModel getModel() {
ELContext el = this.getFacesContext().getELContext();
ValueExpression valExp = this.getValueExpression("item");
Object itemValue = valExp.getValue(el);
return (MetaFieldModel) itemValue;
}当我在itemValue中嵌套MetaFieldRenderer时,UIRepeat总是空的。但是,如果我取消注释,中继器外部的itemValue不是空的。
有人知道怎么回事吗?是否有更好的方法从和属性绑定到我的FacesComponent?我是否在组件中缺少一个必要的实现,以便UIRepeat确实更新它的子组件?
(我使用JSF2.0.3)
发布于 2011-04-23 00:57:00
我期望组件在几乎相同的阶段(或者至少在调用应用程序之前)填充自己(又名: action,navigateTo.)阶段)。但是在Invoke应用程序阶段的UIRepeat总是只包含一个子程序,它将用于重复的itemRenderer,数据还没有被重复(我猜它发生在呈现阶段?)。
通过这些步骤,我明白了一些事情:
<cc:attribute required="true"...,即使您给出了属性,也会抛出一个错误,因为经验教训是,不要对复合组件backbean进行逻辑/验证,只需反映模型。现在,我使用一个模型列表来驱动我的中继器,它可以验证自己,如果模型包含一个警告消息或其他什么奇特的东西,我只是在复合组件中显示它。
https://stackoverflow.com/questions/4280645
复制相似问题