如果editableBaseSetList
是一个 int[],那么baseNumber
是一个 int。您现在将输入文本组件绑定到此 int。
然而,这种绑定不是双向的。输入元素只能看到您绑定到它的元素,而不是它所源自的集合。因此它不知道如何更新这个集合。
因此,您需要绑定到可以更新的东西。例如,如果您的列表包含一个 IntHolder,其中包含用于内部整数的 getter 和 setter(例如 getInt() 和 setInt()),并且列表将是 ArrayList,您将使用:
<ui:repeat value="#{drawsetController.selected.editableBaseSetList}" var="baseNumber">
<h:inputText value="#{baseNumber.int}"/>
</ui:repeat>
在回发之后,JSF 将使用提供的值对列表中的每个 IntHolder 调用 setInt() 方法。
对于已经包含整数或其他不可变类型的集合,将其转换为上述此类集合可能有点麻烦。然而,还有另一种解决方案。在那里你不使用var
属性ui:repeat
但使用它的索引。然后,您将h:inputText
a 绑定到由该索引 var 索引的集合。
例如
假设您有以下 bean:
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
@ManagedBean
@ViewScoped
public class RepeatBean {
List<Integer> list;
public List<Integer> getList() {
return list;
}
@PostConstruct
public void initList() {
list = new ArrayList<Integer>();
list.add(10);
list.add(20);
list.add(30);
}
public String save() {
// list now contains the values provided by the user.
return "";
}
}
用于以下 Facelet:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:body>
<h:form>
<ui:repeat value="#{repeatBean.list}" varStatus="status">
<h:inputText value="#{repeatBean.list[status.index]}" />
</ui:repeat>
<h:commandButton value="Save" action="#{repeatBean.save}" />
</h:form>
</h:body>
</html>
这最初将在您的屏幕上显示 10 20 30。当您更改数字并单击保存时,您可以通过例如断点验证列表实例变量是否包含更新的数字。