h:在ui:repeater中的inputText在ajax更新后显示错误的值

Ale*_*lex 2 ajax jsf primefaces uirepeat

我有一个带有ui:repeater标签的JSF页面,它只显示一个字符串列表和一些控件,用于将字符串添加到列表中.添加字符串时,我使用ajax更新转发器标记,并在不刷新页面的情况下立即显示新字符串.这是我的页面的样子:

<h:body>
    <h:form>
        <p:inputText id="name" value="#{testController.newString}"/>
        <p:commandButton value="Add" actionListener="#{testController.addString}" update="strings" />
    </h:form>       

    <h:panelGroup id="strings">         
        <ui:repeat var="str" value="#{stringModel.strings}" varStatus="stringData">                                                                                                             
            <div>                                       
                <h:outputText value="#{str}" />
                <h:inputText value="#{str}" />
            </div>                                                                                  
        </ui:repeat>
    </h:panelGroup>                              

</h:body>
Run Code Online (Sandbox Code Playgroud)

除inputText组件外,一切正常.用Ajax更新ui-repeater后,仍会显示前一个字符串中的文本.例如,假设我最初有一个包含2个字符串的列表,"val1"和"val2".我输入一个名为"val3"的新字符串并提交表单.列表在服务器端正确更新,转发器更新,现在有3个元素.但是,当新添加的元素中的h:outputText将正确显示"val3"时,inputText将以"val2"作为值显示.所以我最终看起来像这样:

output tag     input tag
val1           val1
val2           val2
val3           val2 (???)
Run Code Online (Sandbox Code Playgroud)

支持bean非常简单:视图范围模型bean

@Component
@Scope("view")
public class StringModel {

    private List<String> strings = Lists.newArrayList("Value 1");

    public List<String> getStrings() {
        return strings;
    }

    public void setStrings(List<String> strings) {
        this.strings = strings;
    }   
}
Run Code Online (Sandbox Code Playgroud)

一个请求作用域控制器bean:

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

    private String newString;
    @Autowired private StringModel model;

    public void addString() {
        model.getStrings().add(newString);
    }

    public String getNewString() {
        return newString;
    }

    public void setNewString(String newString) {
        this.newString = newString;
    }   

}
Run Code Online (Sandbox Code Playgroud)

我做了一些测试,这对任何输入组件实际上都是一样的,可以是textInput,textArea等.任何帮助都将受到高度赞赏.

Bal*_*usC 6

我无法详细说明为什么它在更新后显示错误的值(它将是内部循环索引<ui:repeat>被破坏 - 尝试更新的Mojarra版本),但只是通过索引从varStatus作品引用字符串项.当你将这个列表放在一个表单中时,它还会立即修复将来无法提交已编辑的字符串值的问题,因为String该类是不可变的并且没有setter.

<ui:repeat value="#{stringModel.strings}" var="str" varStatus="loop">
    <div>
        <h:outputText value="#{str}" />
        <h:inputText value="#{stringModel.strings[loop.index]}" />
    </div>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)