0

我需要在 ah:dataTable 中显示一些必须可编辑的实体。用户可以在该表中添加和删除实体。问题是,当我单击“添加”按钮添加实体时,用户输入的状态消失了。

我正在运行 Mojarra 2.1.7-jbossorg-1 (20120227-1401)

这是第一次显示视图,可以看到 dataTable 是空的: 在此处输入图像描述

然后我点击添加,显示如下: 在此处输入图像描述

我在输入中输入了一些值: 在此处输入图像描述

我再次单击“添加”,您可以看到我在第一行键入的值消失了: 在此处输入图像描述

我需要能够保持行的状态,直到我完成编辑,直到我点击“保存”按钮。

我还尝试了 h:dataTable 的rowStatePreserved ="true" 属性,结果如下:

就在我在第一行输入一些内容并单击添加之后: 在此处输入图像描述

第一行状态被保留,但添加的第二行具有与第一行相同的值,即使我还没有在其中输入任何内容。

代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui"
    xmlns:oms="http://aom.org/oms"
    xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <title>Testing</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</h:head>
<h:body>
    <h:form id="myForm" prependId="false">  
        <h:dataTable value="#{testingBean.persons}" var="person" border="1" rowStatePreserved="true">
            <h:column>
                <f:facet name="header">Name</f:facet>
                <h:inputText value="#{person.name}"/>
            </h:column>
            <h:column>
                <f:facet name="header">Age</f:facet>
                <h:inputText value="#{person.age}"/>
            </h:column>
            <h:column>
                <h:commandButton action="#{testingBean.remove(person)}" value="Remove" immediate="true"/>
            </h:column>
        </h:dataTable>
        <h:commandButton action="#{testingBean.add()}" value="Add" immediate="true"/>
        <h:commandButton action="#{testingBean.save()}" value="Save" />
    </h:form>
</h:body>
</html>

测试Bean.java:

package org.aom.oms.controller;

import java.util.ArrayList;
import java.util.List;

import javax.enterprise.inject.Model;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean
@ViewScoped
public class TestingBean {  


    private List<Person> persons = new ArrayList<TestingBean.Person>();


    public List<Person> getPersons() {
        return persons;
    }

    public void setPersons(List<Person> persons) {
        this.persons = persons;
    }


    //Inner class for testing purpose
    public class Person {
        private String name;
        private Integer age;

        public String getName() {
            return name;
        }

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

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }
    }

    public void save() {
        System.out.println("Saving...");
        //myRepository.save(persons);
    }

    public void add() {
        persons.add(new Person());
    }

    public void remove(Person person) {
        persons.remove(person);
    }

}  
4

1 回答 1

0

而不是使用 h:dataTable 使用 Tomahawk t:datatable

MyFacesDataTable 通过两个重要特性扩展了标准 JSF DataTable:

  • 可以保存 DataModel 的状态。
  • 支持可点击的排序标题(请参阅 SortHeader 组件)。

这些属性让你做你想做的事:

preserveRowStates (boolean):指示在数据表再次呈现之前是否不应丢弃每一行的状态。如果数据表中的输入组件没有值绑定并且应该再次显示其中输入的值,则将其设置为 true 可能会非常有用。这只有在数据表的数据模型没有通过排序、删除或添加行而改变时才可靠。默认值:假

forceIdIndexFormula (String):在表体组件的构造中覆盖默认行索引的公式。示例:#{myRowVar.key} > 警告,EL 应该为每一行计算一个唯一值!

于 2013-03-06T20:11:20.693 回答