0

動的に生成される te​​xtBox の編集で問題が発生しています。

私のコードを見てください。

<h:form>
                <h:panelGroup>
                    <h:panelGrid columns="2"> 
                        <h:panelGrid columns="1"> 
                            <h:selectOneRadio id="radio1" value="#{dynamicBean.radiovalue}" layout="pageDirection" >
                                <f:selectItems value="#{dynamicBean.objectList}" var="k1" itemValue="#{k1.value}" itemLabel="" />
                            </h:selectOneRadio>
                        </h:panelGrid>
                        <h:panelGrid columns="1" rowClasses="raw1">
                            <c:forEach items="#{dynamicBean.objectList}" var="k3">
                                <p:inputText value="#{k3.textvalue}" valueChangeListener="#{dynamicBean.ajaxEvent}" >
                                </p:inputText>
                            </c:forEach>
                        </h:panelGrid>
                        <h:commandButton value="add new" action="#{dynamicBean.addNew}"/>
                    </h:panelGrid>
                </h:panelGroup>
            </h:form>

これは私の豆です。

@ManagedBean
@ViewScoped
public class DynamicBean implements Serializable{

    private String radiovalue;
    private List<Pojo> objectList=new ArrayList<Pojo>();
    int i=0;
    private Pojo single=new Pojo();

    public DynamicBean() {   
        System.out.println("In Cons");
        if(objectList.isEmpty())
        {
            Pojo p1=new Pojo();
            p1.setName("Name-"+i);
            p1.setValue("Value-"+i);
            p1.setTextvalue("Text-"+i);
            objectList.add(p1);
            i++;
            setRadiovalue(p1.getValue());
        }
    }

    public void addNew()
    {   
        Pojo p1=new Pojo();
        p1.setName("Name-"+i);
        p1.setValue("Value-"+i);
        p1.setTextvalue("Text-"+i);
        objectList.add(p1);
        i++;
        setRadiovalue(p1.getValue());
    }

    public void ajaxEvent(ValueChangeEvent e)
    {
        System.out.println("New:"+e.getNewValue());
        System.out.print("Old:"+e.getOldValue());
    }

以下は、getter と setter を使用した Pojo の 3 つの変数です。

private String name;
    private String value;
    private String textvalue;

最大の混乱は、テキスト ボックスで最初のオブジェクトの値を変更できるが、新しく生成されたオブジェクトの値を変更できないことです。

ありがとう。

4

1 に答える 1

1

<c:forEach>ビュースコープのBeanを使用しているときに、ビューのビルド時に実行されるJSTLタグを使用しているため、具体的な問題が発生します。ビュー スコープ Bean はビュー ステートに格納されます。フォームをサーバーに送信すると、ビュー ステートが復元されますが、その時点では元のビュー スコープ Bean はまだ利用できないため、新しいビーンが作成されます (したがって、すべてのプロパティがデフォルトに設定されます)。ビューを復元した後、元のビュー スコープ Bean がスコープに戻され、一時的なものをオーバーライドします。

JSTL タグの代わりに、完全な JSF UI コンポーネントが必要です。この特定の目的のために、<h:dataTable>.

交換

<h:panelGrid columns="1" rowClasses="raw1">
    <c:forEach items="#{dynamicBean.objectList}" var="k3">
        <p:inputText value="#{k3.textvalue}" valueChangeListener="#{dynamicBean.ajaxEvent}" >
        </p:inputText>
    </c:forEach>
</h:panelGrid>

<h:dataTable value="#{dynamicBean.objectList}" var="k3" rowClasses="raw1">
    <h:column>
        <p:inputText value="#{k3.textvalue}" valueChangeListener="#{dynamicBean.ajaxEvent}" />
    </h:column>
</h:dataTable>

以下も参照してください。


具体的な問題とは関係ありませんが、コンストラクターにコードの重複があります。addNew()そこでメソッドを呼び出すだけです。i意味がないので、インスタンス変数も削除します。で初期化される代わりに、ローカルのものを使用してList#size()ください。

public DynamicBean() {
    addNew();
}

public void addNew() {
    Pojo p1 = new Pojo();
    int i = objectList.size();
    p1.setName("Name-" + i);
    p1.setValue("Value-" + i);
    p1.setTextvalue("Text-" + i);
    objectList.add(p1);
    setRadiovalue(p1.getValue());
}
于 2012-05-13T04:02:08.330 に答える