編集可能でなければならないエンティティを ah:dataTable に表示する必要があります。ユーザーは、このテーブルからエンティティを追加および削除できます。問題は、「追加」ボタンをクリックしてエンティティを追加すると、ユーザーが入力した状態が失われることです。
Mojarra 2.1.7-jbossorg-1 (20120227-1401) を実行しています
dataTable が空であることがわかるように、ビューが表示されるのはこれが初めてです。
次に、追加をクリックすると、次のように表示されます。
入力にいくつかの値を入力しました:
[追加] をもう一度クリックすると、最初の行に入力した値が消えていることがわかります。
編集を終了するまで行の状態を維持できる必要があり、それは「保存」ボタンをクリックするまでです。
h:dataTable のrowStatePreserved ="true" 属性も試してみましたが、次のようになります。
最初の行に何かを入力して [追加] をクリックした直後:
最初の行の状態は保持されますが、追加された 2 番目の行には、まだ何も入力していないにもかかわらず、最初の行と同じ値が含まれています。
コード:
<!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>
TestingBean.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);
}
}