У меня есть страница JSF с тегом ui: repeater, который просто отображает список строк и некоторые элементы управления для добавления строки в список. При добавлении строки я использую 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. После обновления UI-Repeater с помощью Ajax по-прежнему отображается текст из предыдущей строки. Например, предположим, что изначально у меня есть список с 2 строками: «val1» и «val2». Я ввожу новую строку с именем «val3» и отправляю форму. Список обновляется корректно на стороне сервера, а ретранслятор обновляется, теперь он имеет 3 элемента. Однако, хотя h: outputText во вновь добавленном элементе будет правильно показывать «val3», inputText будет отображаться с «val2» в качестве значения. В итоге я получаю что-то похожее на это:
output tag input tag
val1 val1
val2 val2
val3 val2 (???)
Бобы основы очень просты:
Модель фасоли с областью обзора
@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;
}
}
И боб контроллера области действия запроса:
@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 и т. Д. Любая помощь будет принята с благодарностью.