使用dataTable管理动态数量的字符串

时间:2012-07-10 11:15:46

标签: jsf richfaces jsf-1.2 seam2

我已经陷入了这个问题:

    <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存储类型。

所以我正在寻找的是一种在调用excreateNewExercise时保存deleteExercise值的方法,可以通过不必重新整理整个表格或将其发送到服务器首先。

我可以通过建议here之类的绑定使其工作,但我对避免绑定开销的方式感兴趣。

2 个答案:

答案 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; }
}