【问题标题】:Primefaces dataTable sort after rowEditPrimefaces dataTable 按行排序
【发布时间】:2015-01-27 22:08:45
【问题描述】:

我有点卡在 PrimeFaces dataTable 部分。我使用 rowEditor 和 sortBy 内置方法创建了一个表,但是当我修改表中的一行时,条目的顺序不会更新。

理论上,它应该可以工作:update=":form:fruits"。但它不会更新修改后的行。所以我尝试更新整个表单:update=":form"。但在这种情况下,我会丢失表中的所有数据,除了更新的数据,没有任何设计。

ScreenShot01 ScreenShot02

这是重现问题的非常简短的示例代码。

Fruit.java:

public class Fruit {

    private Integer id;
    private String name;

    public Fruit(Integer id, String name) {
        super();
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (!(o instanceof Fruit)) {
            return false;
        }
        return id == ((Fruit) o).getId();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Fruits.java:

@ManagedBean(name = "fruits")
@ViewScoped
public class Fruits implements Serializable {

    private static final long serialVersionUID = 1L;

    private ArrayList<Fruit> list = new ArrayList<Fruit>() {
        {
            add(new Fruit(1, "apple"));
            add(new Fruit(2, "orange"));
            add(new Fruit(3, "banana"));
            add(new Fruit(4, "pineapple"));
            add(new Fruit(5, "cocoa"));
        }
    };

    public void onRowEdit(RowEditEvent event) {
        Fruit fruit = (Fruit) event.getObject();
        list.set(list.indexOf(fruit), fruit);
    }

    public ArrayList<Fruit> getList() {
        return list;
    }

    public void setList(ArrayList<Fruit> list) {
        this.list = list;
    }
}

fruits.xhtml:

<h:head />

<h:body>
    <h:form id="form">
        <p:dataTable id="fruits" value="#{fruits.list}" var="fruit"
            editable="true" sortBy="#{fruit.name}">
            <p:ajax event="rowEdit" listener="#{fruits.onRowEdit}" update=":form"></p:ajax>
            <p:column headerText="Name" sortBy="#{fruit.name}">
                <p:cellEditor>
                    <f:facet name="output">
                        <h:outputText value="#{fruit.name}" />
                    </f:facet>
                    <f:facet name="input">
                        <h:inputText value="#{fruit.name}" />
                    </f:facet>
                </p:cellEditor>
            </p:column>
            <p:column>
                <p:rowEditor />
            </p:column>
        </p:dataTable>
    </h:form>
</h:body>
</html>

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 我也遇到了同样的问题,有人找到解决办法了吗?

标签: sorting primefaces datatable


【解决方案1】:

今天我遇到了同样的问题并找到了解决方法: 创建一个更新表格的远程命令,并在 cellEdit ajax 事件之后将此远程命令作为 oncomplete 操作调用。

片段:

<h:form id="form">
    <p:remoteCommand name="remoteCmd" update="table" />

    <p:dataTable id="table" ...>

        <p:ajax event="cellEdit" listener="#{anyClass.onCellEdit}"
            oncomplete="remoteCmd();" />

        <p:column headerText="header">
            values
        </p:column>
    </p:dataTable>
</h:form>

【讨论】:

    【解决方案2】:

    尝试使用 @form 而不是 :form 使用 :form:fruits 是正确的形式,我不知道为什么它不适合你。

    【讨论】:

      【解决方案3】:

      我已经尝试了所有可能的关键字(@this、@form、@all),但这些都没有帮助。
      今天我在表单末尾添加了一个刷新按钮。使用此按钮,我可以按预期刷新表格。但我真的不明白为什么 update=":form" 不适用于事件“rowEdit”。

      <p:commandButton value="Refresh">
          <p:ajax update=":form"></p:ajax>
      </p:commandButton>
      

      【讨论】:

        【解决方案4】:

        我在 PF 6.1 中遇到了相同或类似的问题。如果我不通过单击可排序标题对数据表进行排序,我可以很好地编辑一个单元格(我使用的是单元格编辑,而不是行编辑),一切都很好。如果我在任何可排序的标题上对表格进行排序,然后编辑一个单元格,模型数据不会损坏,但编辑后的单元格会在表格中显示其上方或下方看似随机的单元格的值,就好像它正在显示值一样如果表格未排序,则单元格将有。该行中的其他单元格都很好。如果我单击单元格重新编辑它,输入元素中显示的值是正确的;如果我随后将焦点移出单元格,则会再次出现不正确的值。如果我然后刷新页面或进行其他排序,则表中显示的值是正确的。

        我遇到了模型数据已损坏但现在无法重现的情况。

        我用 RemoteCommand 尝试了 Gregor 的解决方法,没有改变。

        我还有一个“刷新”按钮,它确实可以解决问题,但用户使用它来实现此目的并不直观。

        我知道这不是答案,但它可能有助于解决相同问题的人。只是添加到知识库中。

        【讨论】:

          猜你喜欢
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 2012-10-01
          • 2016-09-18
          • 1970-01-01
          • 2013-12-26
          • 1970-01-01
          相关资源
          最近更新 更多