0

編集可能でなければならないエンティティを 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);
    }

}  
4

1 に答える 1

0

h:dataTable を使用する代わりに、Tomahawk t: datatable を使用します。

MyFacesDataTable は、次の 2 つの重要な機能によって標準の JSF DataTable を拡張します。

  • DataModel の状態を保存する可能性。
  • クリック可能な並べ替えヘッダーのサポート (SortHeader コンポーネントを参照)。

これらの属性により、必要なことを実行できます。

preserveRowStates (boolean): データテーブルが再度レンダリングされる前に、各行の状態を破棄してはならないかどうかを示します。これをtrueに設定すると、データテーブル内の入力コンポーネントに値バインディングがなく、そこに入力された値を再度表示する必要がある場合に役立ちます。これは、行の並べ替え、削除、または追加によってデータテーブルのデータモデルが変更されていない場合にのみ、確実に機能します。デフォルト: false

forceIdIndexFormula (文字列): テーブルの本体コンポーネントの構築でデフォルトの行インデックスをオーバーライドする式。例: #{myRowVar.key} > 警告、EL は行ごとに一意の値に評価する必要があります。

于 2013-03-06T20:11:20.693 に答える