0

フォームが編集可能モードの場合、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番目にデータを適用します

ワークフロー:

  1. p:dataTableおよびh:dataTableのinputTextsのデータを変更してみてください

  2. リストのデータをクリアする(文字列のarrayList)-[クリア]ボタンをクリックします(データベースにデータを保存したくないため、フォームで[キャンセル]をクリックするとします)

  3. 新しいデータをロードする-[更新]ボタンをクリックします(新しいデータで新しいフォームを開いていると想像してください)

質問: p:inputTextを含むp:dataTableが、ロードされたデータではなく、手動で変更されたデータを保存するのはなぜですか?この場合、p:dataTableをh:dataTableのように動作させる方法はありますか?

4

2 に答える 2

5

解決策は次のとおりです。primefacesresetInput

私の例では、次のようになります。

 <p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true"
          update=":form:testTable :form:testTable1 :form:testTable2"> 
    <p:resetInput target=":form:testTable" />
 </p:commandButton>


編集: 場合によっては-上記が機能しない場合-primefaces拡張機能からのものを試してください:

<pe:resetInput for=":form:testTable" />
于 2012-12-18T16:04:44.700 に答える
2

発生している問題は、フォームを送信するときに、フォーム内のこのリストにバインドされているすべてのデータテーブル(または)の#{test.list}値が送信されることです。言い換えると:<p><h>

  • JSFは、データテーブルの値をにバインドtestTableします#{test.list}

  • JSFは、データテーブルの値をにバインドtestTable1します#{test.list}。これらの値は、datatableからバインドされた値を置き換え、testTableそこにあるデータは失われます。#{test.list}のデータが含まれますtestTable1

  • JSFは、データテーブルの値をにバインドtestTable2します#{test.list}。ここでの値は古い値であるため、これらはに送信される値になります#{test.list}

この問題を解決する最善の方法は、単一<p:dataTable>(または<h>、必要に応じて)と、テーブルが表示モードか編集モードかを制御する管理対象Beanの属性を使用することです。

JSFコード

<h:form id="form">
    <p:dataTable var="v" value="#{test.list}" id="testTable">
        <p:column headerText="Test value">
            <h:outputText value="#{v}" rendered="#{not test.editMode}" />
            <p:inputText value="#{v}" rendered="#{test.editMode}" />
        </p:column>
    </p:dataTable>

    <p:commandButton value="Clear" actionListener="#{test.clear()}" immediate="true"
        update="testTable" />
    <p:commandButton value="Update" actionListener="#{test.update()}"
        update="testTable" />
    <!-- adding a new button just for testing purposes -->
    <p:commandButton value="Submit list" action="#{test.submit}" />
</h:form>

マネージドBeanコード

//no need of CDI
@ManagedBean
@ViewScoped
public class Test implements Serializable {

    private List<String> list;
    private boolean editMode = false;

    public Test() {

    }

    @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");     
    }

    //method for testing purposes
    public void submit() {
        //in real life web apps, you should log the messages, don't use System.out
        System.out.println("Showing actual values of list attribute.");
        for(String s : list) {
            System.out.println(s);
        }
    }
}
于 2012-12-15T17:35:56.877 に答える