我们为项目创建了一个JSF表组件,它使用<ui:repeat>
来创建表。在表中添加表的新要求(第二个表位于一行并且可以折叠)使我们遇到麻烦,因为<ui:repeat var="row" ...>
在表componenten中静态设置,而内部表使用行变量迭代列表时的外表。现在我要创建的是这样的:
<div>
<myfw:mytable dataModel="#{bean.user}" varName="user" ...>
<myfw:mycolumn value="#{user.name}"/>
<myfw:myexpendablecolumn>
<myfw:mytable dataModel="#{bean.acl}" varName="acl" ...>
<myfw:mycolumn value="#{acl.name}"/>
</myfw:mytable>
</myfw:myexpendablecolumn>
</myfw:mytable>
</div>
在表组件中,应设置var属性...
<composite:interface>
...
<composite:attribute name="varName" required="false"
type="java.lang.String" default="row" />
</composite:interface>
<composite:implementation>
...
<ui:repeat var="#{varName}" value="#{cc.attrs.dataModel.wrappedData}"
varStatus="loop">
<div class="floating_table_row">
<composite:insertChildren />
</div>
</ui:repeat>
</composite:implementation>
......但遗憾的是,这不起作用。我已经用<c:forEach>
尝试了它,但结果是一样的,列的值是空的,没有显示数据。有没有办法动态设置<ui:repeat>
?
答案 0 :(得分:1)
经过进一步研究后,我偶然发现了这个页面https://java.net/jira/browse/FACELETS-372,其中UIRepeat类,特别是getVar
方法被修改为访问ValueExpression,而不是
public String getVar() {
return this.var;
}
......方法如下:
public String getVar() {
if (this.var != null) {
return this.var;
}
ValueExpression ve = this.getValueExpression("var");
if (ve != null) {
return (String) ve.getValue(getFacesContext().getELContext());
}
return null;
}
来自https://java.net/jira/browse/FACELETS-372的附件有进一步修改。遗憾的是,UIRepeat
类不能简单地扩展,因为在私有方法中使用了var
属性,所以我现在有一个<myfw:repeat>
,它利用了来自的UIRepeat
类。页。