0

Myには、 single と multiple の 2 つの値を持つコンポーネントh:formが含まれています。p:selectOneMenuには、デフォルトのh:formも含まれていますp:inputText。私の目的は、複数のp:inputText値が選択されている場合にのみ、複数のコンポーネントを追加することです。添付のスクリーンショットをご覧ください- ここに画像の説明を入力

以下は、ajaxアイコンボタンがクリックされるたびにリクエストを送信することを想定している私のビューです-

<h:form>
    <p:panel header="Dynamically Add textbox">
        <p:selectOneMenu id="runType" value="#{repeateRun.runType}">
            <f:selectItems value="#{repeateRun.runList}" var="runType" itemLabel="#{runType}" itemValue="#{runType}" />
            <p:ajax update="outPanel" listener="#{repeateRun.renderComponent}" />
        </p:selectOneMenu>
        <h:panelGrid id="runList">
            <ui:repeat value="#{repeateRun.runs}" var="run">
                <p:inputText value="#{run.runValue}" />
            </ui:repeat>
        </h:panelGrid>
        <p:outputPanel id="outPanel">
            <p:commandButton update="runList" icon="ui-icon-plusthick" title="Add more" rendered="#{repeateRun.showAddButton}">
                <f:ajax render="runList" listener="#{repeateRun.addRun}" />
            </p:commandButton>
        </p:outputPanel>
    </p:panel>
</h:form>

@ViewScoped @ManagedBeanRepeateRunは次のとおりです-

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
@ManagedBean
@ViewScoped
public class RepeateRun implements Serializable {
    private static final long serialVersionUID = 1L;
    private List<String> runList;
    private List<Run> runs;
    private int runValue;
    private String runType;
    private boolean showAddButton = false;
    private static final String SINGLE = "Single";
    private static final String MULTIPLE = "Multiple";
    //Note : Getters Setters are removed while putting here
    @PostConstruct
    public void initBean() {
        this.setRunList(this.populateRunList());
        this.setRuns(this.populateRuns());
    }
    public void addRun() {
        if (this.runs == null) {
            this.setRuns(this.populateRuns());
        } else {
            this.runs.add(this.defaultRun());
        }
    }
    public void renderComponent() {
        if (this.getRunType().equals(SINGLE)) {
            this.setShowAddButton(false);
        } else {
            this.setShowAddButton(true);
        }
    }
    private List<String> populateRunList() {
        List<String> runList = new ArrayList<String>();
        runList.add(SINGLE);
        runList.add(MULTIPLE);
        return runList;
    }
    private Run defaultRun() {
        Run defaultRun = new Run();
        defaultRun.setRunValue(1);
        return defaultRun;
    }
    private List<Run> populateRuns() {
        List<Run> runs = new ArrayList<Run>();
        runs.add(this.defaultRun());
        return runs;
    }
}

したがってf:selectItems、プラスアイコンボタンで値 Multiple を選択すると、ボタンが表示されますが、ボタンは添付されたメソッドを呼び出していませんaddRunaddRunクリック後にメソッド呼び出しを確認するために、メソッドにいくつかのsysoutステートメントを入れましたaddRunsysoutフラッシュされていないことがわかりました。同時に、xmlfirebug に何らかの反応が見られました。
問題はどこだ?

4

1 に答える 1

2

問題は、f:ajaxで動作しないことでしたp:commandButton。以下は犯人の行です-

<p:commandButton update="runList" icon="ui-icon-plusthick" title="Add more" rendered="#{repeateRun.showAddButton}">
     <f:ajax render="runList" listener="#{repeateRun.addRun}" />
</p:commandButton>

上の行は下の行に置き換える必要があります

<p:commandButton actionListener="#{repeateRun.addRun}" update="runList" icon="ui-icon-plusthick" title="Add more" rendered="#{repeateRun.showAddButton}" />
于 2013-04-07T19:22:54.400 に答える