JSF:嵌套ui:repeat中的值绑定

wax*_*ing 4 java jsf facelets jsf-2

我对<ui:repeat>标签有一个奇怪的问题.即使对于我非常简单的示例,嵌套重复组件中的值绑定也无法按预期工作.

我有一个像这样的简单小脸:

<h:body>
<h:form>
<ui:repeat value="#{sandbox.rows}" var="row">
    <ui:repeat value="#{row.columns}" var="column">
        <h:outputText value="#{column.value}" />
        <h:selectBooleanCheckbox value="#{column.value}" />
    </ui:repeat>
    <br/>
</ui:repeat>

<h:commandButton action="#{sandbox.refresh}" value="Refresh" />
</h:form>
</h:body>
Run Code Online (Sandbox Code Playgroud)

和沙盒类:

@Component
@Scope("request")
public class Sandbox {

    public static class Row {
        private List<Column> columns = Arrays.asList(new Column(), new Column());
        public List<Column> getColumns() {
            return columns;
        }
    }

    public static class Column {
        private boolean value;
        public void setValue(boolean value) {
            this.value = value;
        }
        public boolean getValue() {
            return this.value;
        }
    }

    public List<Row> rows = Arrays.asList(new Row(), new Row()); 

    public List<Row> getRows() {
        return rows;
    }

    public void refresh() {
        rows.get(0).getColumns().get(0).setValue(true);
        System.err.println("refresh clicked");
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的facelet循环遍布沙盒中的"行",沙盒中有许多"列",每个列都有一个值.对于每个此类列,将打印该值,并<h:selectBooleanCheckbox>输出与其绑定的值.

加载页面时,所有值都显示为false,并且所有复选框都未选中.现在,单击refresh应该将第一行第一列的值更改为true.但是,我得到以下输出:

true [ ] false [ ]
false [ ] false [ ]

换句话说,它<h:outputText>显示为true,但选中复选框.当然我可以在调用应用程序阶段更改模型,并且在渲染视图时应该反映出来吗?

如果我删除了一级嵌套,那么只有一个嵌套,<ui:repeat>一切都按预期工作:复选框被选中,值显示为true.所以这似乎与UIRepeat组件有关.事实上,似乎UIRepeat在它嵌套在另一个UIRepeat中时有一些特殊处理.

从我收集的内容来看,UIRepeat基本上会多次重新渲染相同的组件.在每次调用render之间,它加载EditableValueHolder从内部映射实现的所有子组件的"state"(value,localValue,submittedValue)(键入渲染组件的实际id).我已经尝试在发生这种情况时设置断点来跟踪在已保存状态的地图中插入了什么值,但它实际上是一团糟,因为saveChildState和restoreChildState方法被调用了大约数十亿次.

有任何想法吗?我可以这样做吗?我真正需要的是能够呈现一个水平和垂直动态增长的表,包含复选框,输入字段等.我瞥了一眼,<h:dataTable>但我相信它在这种情况下不起作用.

Bal*_*usC 7

Interesting issue. I can reproduce this with Mojarra 2.0.3. It's definitely a problem in state saving of ui:repeat. I've reported it as issue 1807 to the Mojarra guys. It works by the way fine when the outer loop is a c:forEach.