【问题标题】:Primefaces DataTable CellEdit not updating outputLabelPrimefaces DataTable CellEdit 不更新 outputLabel
【发布时间】:2018-07-15 21:37:07
【问题描述】:

我实际上在各种不同的论坛中找到了很多关于此的内容,但似乎没有一个对我有用。我的问题甚至没有那么复杂,但我不知道为什么它不起作用。我已经设置了我的数据表,使其可编辑并设置了 editMode="cell"。我设置了 ajax 事件并触发,但新旧值始终为 null。

当我完成一个单元格的编辑并转到下一个单元格时,该单元格会恢复到旧值。当我重新点击它时,它会显示新值。 outputLabel 和 inputText 标记都使用完全相同的变量,但它们显示的值不同。我也尝试过通过方法调用手动更新表,但什么也没做。还尝试在 inputText 标记内放置一个 p:ajax 标记来更新表格,但这也不起作用。

这是我的 JSF 代码:

<p:dataTable id="dynamicTable" value="#{column.values}" var="value" editable="true" editMode="cell">
  <p:ajax event="cellEdit" listener="bean.updateCell" immediate="true" update=":dynamicTable"/>
  <p:columns value="#{bean.columns}" var="column">
    <f:facet name="header">
      <p:outputLabel value="#{column.name}"/>
    </f:facet>
    <p:cellEditor>
      <f:facet name="output"><p:outputLabel value="#{value}"/></f:facet>
      <f:facet name="input"><p:inputText value="#{value}"/></f:facet>
    </p:cellEditor>
  </p:columns>
</p:dataTable>

这是我的豆子:

@ManagedBean(name = "bean")
@ViewScoped
public class Bean implements Serializable {

  private ArrayList<Column> columns;
  
  public ArrayList<Column> getColumns(){
    return columns;
  }
  
  public void setColumns(ArrayList<Column> columns){
    this.columns = columns;
  }
  
  @PostConstruct
  void init(){
    columns = new ArrayList<>();
    Column column = new Column();
    column.setName("Acronym");

    ArrayList<String> values = new ArrayList<>();
    values.add("KFC");
    values.add("TTYL");
    values.add("BRB");

    column.setValues(values);
    columns.add(column);

    column = new Column();
    column.setName("Meaning");

    values = new ArrayList<>();
    values.add("Kentuky Fried Chicken");
    values.add("Talk to you later");
    values.add("Be right back");

    column.setValues(values);
    columns.add(column);
  }
  
  public void updateCell(CellEditEvent event){
    System.out.println((String) event.getNewValue();
  }
}

还有我的 Column 类:

public class Column{
  private ArrayList<String> values;
  private String name;
  
  public ArrayList<String> getValues(){
    return values;
  }
  
  public void setValues(ArrayList<String> values){
    this.values = values;
  }
  
  public String getName(){
    return name;
  }
  
  public void setName(String name){
    this.name = name;
  }
}

我重写了代码以不包含敏感信息和重命名的变量,因此如果我遗漏了某些内容,可能是我的代码中已经包含它,但不小心将其删除了。

【问题讨论】:

  • 当值被改变时,除了打印新值你什么都不做,你能告诉我们当你点它时显示什么
  • 当我尝试在 p:ajax 侦听器中打印新值或旧值时,它显示“null”。当我尝试打印所有列及其值时,所有值都显示为“null”。我确定这与我如何显示列值有关。有些东西正在破坏,但没有抛出任何错误。就像它无法使用“getValue()”方法或其他东西找到正确的对象。我也尝试过创建自定义“Value”对象,这样我就可以使用“value.value”,这样它就可以使用“getValue()”方法,但这仍然不起作用。
  • 事实证明我什至没有正确地做列,而且结果也不对。我敢肯定,一旦我弄清楚了,它应该可以正常工作。

标签: primefaces jsf-2 datatable


【解决方案1】:

原来我做 p:columns 标签的方式不正确。在我进行以下更改后,我的问题得到了解决。

我创建了一个名为 TableRow 的附加类,其中包含各种 String 对象来表示要使用的列。这是新代码:

JSF:

<p:dataTable id="dynamicTable" value="#{bean.tblRows}" var="row" editable="true" editMode="cell">
  <p:columns value="#{bean.columns}" var="column">
    <f:facet name="header">
      <p:outputLabel value="#{column.name}"/>
    </f:facet>
    <p:cellEditor>
      <f:facet name="output"><p:outputLabel value="#{row[column.variable]}"/></f:facet>
      <f:facet name="output"><p:inputText value="#{row[column.variable]}"/></f:facet>
    </p:cellEditor>
  </p:columns>
</p:dataTable>

豆子:

@ManagedBean (name = "bean")
@ViewScoped
public class Bean implements Serializable {
  
  private ArrayList<TableRow> tblRows;
  private ArrayList<Column> columns;
  
  public ArrayList<TableRow> getTblRows(){
    return tblRows;
  }
  
  public void setTblRows(ArrayList<TableRow> tblRows){
    this.tblRows = tblRows;
  }
  
  public ArrayList<Column> getColumns(){
    return columns;
  }
  
  public void setColumns(ArrayList<Column> columns){
    this.columns = columns;
  }
  
  @PostConstruct
  void init(){
    columns = new ArrayList<>();
    columns.add(new Column("Acronym", "col1");
    columns.add(new Column("Meaning", "col2");
    
    tblRows = new ArrayList<>();
    tblRows.add(new TableRow("KFC", "Kentuky Fried Chicken"));
    tblRows.add(new TableRow("TTYL", "Talk to you later"));
    tblRows.add(new TableRow("BRB", "Be right back"));
  }
}

TableRow 类:

public class TableRow {
  
  private String col1;
  private String col2;
  
  public TableRow(String col1, String col2){
    this.col1 = col1;
    this.col2 = col2;
  }
  
  public String getCol1(){
    return col1;
  }
  
  public void setCol1(String col1){
    this.col1 = col1;
  }
  
  public String getCol2(){
    return col2;
  }
  
  public void setCol2(String col2){
    this.col2 = col2;
  }
  
}

列类:

public class Column {
  
  private String name;
  private String variable;
  
  public Column(String name, String variable){
    this.name = name;
    this.variable = variable;
  }
  
  public String getName(){
    return name;
  }
  
  public void setName(String name){
    this.name = name;
  }
  
  public String getVariable(){
    return variable;
  }
  
  public void setVariable(String variable){
    this.variable = variable;
  }
}

我之所以使用“col1”和“col2”而不是给出不同的变量名称,是因为用户可以选择列标题名称,所以我不会提前知道如何命名变量。我想知道是否有人愿意启发我如何更好地动态处理这个问题。初始化 bean 时,我不知道会有多少列或列名将是什么。

【讨论】:

    猜你喜欢
    • 2015-05-04
    • 2013-09-07
    • 1970-01-01
    • 2014-09-02
    • 2013-07-23
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多