【发布时间】:2011-10-26 10:19:30
【问题描述】:
我有一个带有 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 (???)
backing 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 等。任何帮助将不胜感激。
【问题讨论】:
-
这毫无意义。您输出完全相同的 #{str} 两次。怎么可能改变?您可以尝试第三次打印 #{str} 看看它给出了什么吗?
-
问题不在于我打印出来的次数,而在于 JSF 如何处理 ui:repeat 中的输入元素。我可以打印 10 次,所有输入组件都会有错误的值,而输出不会。
-
我不敢相信您粘贴了正确的代码。我让你尝试打印第三个值,因为我认为你可能会在某个地方看到错误。显然你不是问题,而是这个异常错误......
标签: ajax jsf primefaces uirepeat