我已经陷入了这个问题:
<rich:dataTable id="tabA" value="#{m.a}" rowKeyVar="nr" var="ex">
<rich:column><h:outputText value="Exercise #{nr + 1}:" /></rich:column>
<rich:column><h:inputText value="#{ex}" /></rich:column>
</rich:dataTable>
<h:panelGrid columns="2">
<a4j:commandButton value="+" title="new" ajaxSingle="true"
action="#{m.createNewExercise}" reRender="tabA"/>
<a4j:commandButton value="-" title="remove last" ajaxSingle="true"
action="#{m.deleteExercise}" reRender="tabA"/>
</h:panelGrid>
因为这是更大形式的一部分,所以我设置了ajaxSingle="true"
。
我正在迭代的值是一个字符串列表,定义如下:
@Entity
public class M {
...
private List<String> a = Lists.newArrayList();
@CollectionOfElements
public List<String> getA() { return a; }
public void setA(List<String> a) { this.a = a; }
}
提交时无法更新支持列表a
(通过简单的<h:commandButton>
提交)。由于提交了inputText
元素的内容,JSF似乎无法应用这些值。也许有人可以说明这是否是因为@CollectionOfElements
中的M
存储类型。
所以我正在寻找的是一种在调用ex
或createNewExercise
时保存deleteExercise
值的方法,可以通过不必重新整理整个表格或将其发送到服务器首先。
我可以通过建议here之类的绑定使其工作,但我对避免绑定开销的方式感兴趣。
答案 0 :(得分:0)
简单方法:将@KeepAlive
注释添加到M bean中。有了这个,你的bean将被保存并恢复你在同一个视图上的每个请求,你不必担心在(几乎)每个请求上保存bean会话和恢复的数据。
更难的方法:您必须在会话中保存列表值,并在M bean上发出的每个请求中恢复它。
建议:如果可以,请转到JSF 2和RF 4.在JSF 2中,已经有一个ViewScope可以解决这类问题(还有更多)。
答案 1 :(得分:0)
问题是ajaxSingle="true"
属性,加上JSF显然无法更新@CollectionOfElements
。
ajaxSingle
的描述清楚地表明它跳过了不属于它的组件的所有模型更新(不 dataTable,也不是它的value属性)。所以这是经典的PEBKAC。
但是这仍然无法使用ajaxSingle,这让我相信当我测试该选项时,JSF方面是可以的。
我最终得到的是:
<rich:dataTable id="tabA" value="#{m.a}" rowKeyVar="nr" var="ex">
<rich:column><h:outputText value="Exercise #{nr + 1}:" /></rich:column>
<rich:column><h:inputText value="#{ex}" /></rich:column>
</rich:dataTable>
<h:panelGrid columns="2">
<a4j:commandButton value="+" title="new"
action="#{m.createNewExercise}" reRender="tabA"/>
<a4j:commandButton value="-" title="remove last"
action="#{m.deleteExercise}" reRender="tabA"/>
</h:panelGrid>
豆子:
@Entity
public class M {
...
private List<Exercise> a = Lists.newArrayList();
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "ex_id")
public List<Exercise> getA() { return a; }
public void setA(List<Exercise> a) { this.a = a; }
}
@Entity
public class Exercise {
[id definition omitted]
private M m;
private String description;
@ManyToOne
@JoinColumn(name = "ex_id", insertable = false, updatable =false)
public M getM() { return m; }
public void setM(M m) { this.m = m; }
public String getDescription() { return description; }
public void setDescription(String d) { this.description = d; }
}