文字列のリストと、リストに文字列を追加するためのいくつかのコントロールを表示するだけの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コンポーネントを除いてすべてが機能します。ui-repeaterがAjaxで更新された後も、前の文字列のテキストが表示されます。たとえば、最初に「val1」と「val2」の2つの文字列を持つリストがあるとします。「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などのどの入力コンポーネントでも同じように機能します。助けていただければ幸いです。