フォームが編集可能モードの場合、primefacesデータテーブル内にinputTextsを含める必要があります。
[immediate = "true"を使用したフォームのクリーニング(フォームの検証なし)を除いて、すべてが正しく機能します。その場合、primefacesdatatableは予測できない動作をします。datatableに新しいデータを入力した後も、古い値が保存されます。
短い例-h:dataTableとp:dataTableの違いを示す-しかし、例の3つのテーブルのうち1つしかない場合も同じように機能します:test.xhtml
<h:body>
<h:form id="form">
<p:dataTable var="v" value="#{test.list}" id="testTable">
<p:column headerText="Test value">
<p:inputText value="#{v}"/>
</p:column>
</p:dataTable>
<h:dataTable var="v" value="#{test.list}" id="testTable1">
<h:column>
<f:facet name="header">
<h:outputText value="Test value" />
</f:facet>
<p:inputText value="#{v}" />
</h:column>
</h:dataTable>
<p:dataTable var="v" value="#{test.list}" id="testTable2">
<p:column headerText="Test value">
<h:outputText value="#{v}" />
</p:column>
</p:dataTable>
<p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true" update=":form:testTable :form:testTable1 :form:testTable2"/>
<p:commandButton value="Update" actionListener="#{test.update()}" update=":form:testTable :form:testTable1 :form:testTable2"/>
</h:form>
</h:body>
そしてjava:
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
@Named
@ViewScoped
public class Test implements Serializable {
private static final long serialVersionUID = 1L;
private List<String> list;
@PostConstruct
private void init(){
update();
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public void clear() {
list = new ArrayList<String>();
}
public void update() {
list = new ArrayList<String>();
list.add("Item 1");
list.add("Item 2");
}
}
上記の例では、3つの構成があります:1。p:dataTableとp:inputText 2. h:dataTableとp:inputText 3. p:dataTableとh:outputText
そして2つのボタン:最初にデータをクリアし、2番目にデータを適用します
ワークフロー:
p:dataTableおよびh:dataTableのinputTextsのデータを変更してみてください
リストのデータをクリアする(文字列のarrayList)-[クリア]ボタンをクリックします(データベースにデータを保存したくないため、フォームで[キャンセル]をクリックするとします)
新しいデータをロードする-[更新]ボタンをクリックします(新しいデータで新しいフォームを開いていると想像してください)
質問: p:inputTextを含むp:dataTableが、ロードされたデータではなく、手動で変更されたデータを保存するのはなぜですか?この場合、p:dataTableをh:dataTableのように動作させる方法はありますか?