我有一个带有 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>
除了 inputText 组件外,一切正常。使用 Ajax 更新 ui-repeater 后,仍会显示上一个字符串中的文本。例如,假设最初我有一个包含 2 个字符串“val1”和“val2”的列表。我输入一个名为“val3”的新字符串并提交表单。列表在服务器端正确更新,中继器也更新了,它现在有 3 个元素。但是,虽然新添加的元素中的 h:outputText 将正确显示“val3”,但 inputText 将显示为“val2”作为值。所以我最终得到了这样的东西:
output tag input tag
val1 val1
val2 val2
val3 val2 (???)
支持 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;
}
}
和一个请求范围的控制器 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;
}
}
我做了一些测试,这实际上对任何输入组件都以相同的方式工作,例如 textInput、textArea 等。任何帮助将不胜感激。