【问题标题】:Using <ui:repeat><h:inputText> on a List<String> doesn't update model values在 List<String> 上使用 <ui:repeat><h:inputText> 不会更新模型值
【发布时间】:2012-06-02 14:19:44
【问题描述】:

这是场景(简化):

有一个 bean(称为 mrBean)有一个成员和适当的 getter/setter:

private List<String> rootContext;

public void addContextItem() {
    rootContext.add("");
}

JSF 代码:

<h:form id="a_form">
            <ui:repeat value="#{mrBean.stringList}" var="stringItem">
                    <h:inputText value="#{stringItem}" />
            </ui:repeat>
            <h:commandButton value="Add" action="#{mrBean.addContextItem}">
                <f:ajax render="@form" execute="@form"></f:ajax>
            </h:commandButton>
</h:form>

问题是,当单击“添加”按钮时,在 &lt;h:inputText/&gt; 中输入的代表 stringList 中的字符串的值不会被执行。

实际上,mrBean.stringList setter (setStringList(List&lt;String&gt; stringList)) 永远不会被调用。

知道为什么吗?

一些信息 - 我在 Tomcat 6 上使用 MyFaces JSF 2.0。

【问题讨论】:

    标签: string list jsf jsf-2 uirepeat


    【解决方案1】:

    String 类是不可变的,没有值的设置器。 getter 基本上就是Object#toString() 方法。

    您需要直接在List 上获取/设置值。您可以通过&lt;ui:repeat varStatus&gt; 提供的列表索引来做到这一点。

    <ui:repeat value="#{mrBean.stringList}" varStatus="loop">
        <h:inputText value="#{mrBean.stringList[loop.index]}" />
    </ui:repeat>
    

    stringList 也不需要设置器。 EL 将通过List#get(index) 获取项目并通过List#add(index,item) 设置项目。

    【讨论】:

    • 谢谢!我认为问题在于值是不可变的,但我不知道 JSF 是否能以某种方式克服这个问题。这真的解释了,所以谢谢。
    • 那么,loop.index这里返回的是列表当前元素的索引?
    猜你喜欢
    • 2014-02-09
    • 2011-04-17
    • 1970-01-01
    • 2021-05-15
    • 2015-11-29
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多