【问题标题】:JSF: value bindings inside nested ui:repeatJSF:嵌套 ui:repeat 内的值绑定
【发布时间】:2011-04-12 03:08:27
【问题描述】:

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

我有一个像这样的简单 facelet:

<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>

还有一个沙盒类:

@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");
    }
}

所以我的 facelet 循环遍历沙盒中的“行”,其中有许多“列”,每个列都有一个值。对于每个这样的列,都会打印值,并输出绑定了值的&lt;h:selectBooleanCheckbox&gt;

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

真假 [ ] 假[]假[]

换句话说,&lt;h:outputText&gt; 将其显示为 true,但复选框选中。当然,我可以在调用应用程序阶段更改模型,并且应该在渲染视图时反映出来?

如果我删除了一层嵌套,那么只有一个&lt;ui:repeat&gt;,一切都会按预期进行:复选框被选中并且值显示为true。所以这似乎与 UIRepeat 组件有关。事实上,当 UIRepeat 嵌套在另一个 UIRepeat 中时,它似乎有一些特殊处理。

据我所知,UIRepeat 本质上会多次重新渲染同一个组件。在每次调用渲染之间,它会从内部映射加载所有实现EditableValueHolder 的子组件的“状态”(值、localValue、submittedValue)(以渲染组件的实际ID 为键)。我尝试在发生这种情况时设置断点以跟踪将什么值插入到已保存状态的映射中,但这确实是一团糟,因为 saveChildState 和 restoreChildState 方法被调用了大约无数次。

有什么想法吗?我可以采取不同的方式吗?我真正需要的是能够渲染一个水平和垂直动态增长的表格,包含复选框、输入字段等。我看了&lt;h:dataTable&gt;,但我相信在这种情况下它不会起作用。

【问题讨论】:

    标签: java jsf jsf-2 facelets


    【解决方案1】:

    有趣的问题。我可以用 Mojarra 2.0.3 重现这个。这绝对是ui:repeat的状态保存问题。我已将其报告为 issue 1807 给 Mojarra 的家伙。当外循环是c:forEach 时,它可以正常工作。

    【讨论】:

    • 我的外部循环不能是 c:forEach,因为在我的实际应用程序中,它都嵌入在复合组件中。
    • 再一次,我对您的知识和乐于助人感到惊讶。谢谢!我会热切地跟踪这个问题,看看他们怎么说。
    • 不过,它可以是。你有什么问题?编辑:没问题,不客气。
    • 我想这应该是一个单独的问题。它的本质是:我有一个复合组件(一个网格),它有一个“行”属性,用于绘制表格,如示例中所示。据我了解,构建组件树时“rows”的值将不可用,这使得 c:forEach 永远循环。
    • @BalusC,如果这里有任何解决方法,您能否就类似问题提出建议:stackoverflow.com/questions/24856373/…
    猜你喜欢
    • 2010-12-28
    • 2011-05-16
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2013-04-27
    • 2017-06-01
    • 2013-10-30
    • 1970-01-01
    相关资源
    最近更新 更多