0

私は過去 2 日間、これに本当に悩まされており、Primefaces が ID に基づいてクライアントの UI コンポーネントを更新する方法を理解するのに苦労しています。

私は ah:selectOneMenu を持っており、表示されるパネルの数をカウントしています。各 p:panel には、多数のフォーム要素を持つ panelGrid が含まれます。ドロップダウンの onchange イベントが発生し、Managed Bean でカウントを確認できます。ただし、クライアント側でパネルが動的に増加することはありません。p:ajax パラメーターに何か問題があると思いますが、それがどのように機能するかを完全には理解していません。関連するコードは次のとおりです。

    <h:selectOneMenu id="numapps" value="#{mbean.appCount}">
                <f:selectItem itemLabel="1" itemValue="1" />
                <f:selectItem itemLabel="2" itemValue="2" />
                <f:selectItem itemLabel="3" itemValue="3" />
                <f:selectItem itemLabel="4" itemValue="4" />
                <f:selectItem itemLabel="5" itemValue="5" />
                <p:ajax update="appsContainer" event="change"   
                    listener="#{mbean.onChangeNumApps()}" />    
    </h:selectOneMenu>

    <p:panel id="appsContainer" >
           <p:panel header="Application" id="appsPane" value="#{mbean.submittedApps}" var="app" multiple="true">

submitApps は、パネル フォーム要素を含むリストです。これが私のmbeanリスナーです:

public void onChangeNumApps()
{
    List<Apps> c = new ArrayList<Apps>();
    logger.info("on change event fired");
    logger.info("new value is "+mbean.getAppCount());
    for (int i=0;i < mbean.getAppCount();i++)
    {
        c.add(new App());
    }
    mbean.setSubmittedApps(c);
}

何らかの理由で p:selectone を動作させることができなかったため、p:ajax と h:selectone を混在させています。

4

2 に答える 2

0

パネル上で繰り返すのではなく、ui:repeatで動作するようになりました。

于 2012-06-23T09:11:52.950 に答える
0

JSF ツリーからの動的コンポーネントの追加/削除は、はるかに簡単です。私は主に RF と JSF2.0 に取り組んでいるため、primefaces のコードに関してはあまり役に立ちませんが、値変更リスナー。

投稿では、から送信された値に基づいて動的な数のフォーム要素が必要です

これについては、valuechanellistener で、選択されたパネルの数の値を取得できます。

  1. valuechangelistener で新しい Panel を作成します。
  2. valuechangelistener から受け取った数に基づいて、目的のフォーム要素を作成します。
  3. これらの要素を子としてパネルに追加します。
  4. このパネルを子として、以前のページに存在するパネルに追加します。

各動的コンポーネントに ID を手動で割り当てる代わりに、一意の ID を自動的に提供する JSF 組み込みの uniqueID 関数を使用できます。値を抽出するために動的コンポーネントをさらに使用する必要がある場合は、ID を別のコレクションに保存し、ID に基づいて動的コンポーネントの値をフェッチする必要があります。

コンポーネントの一意の ID を取得するには:-

FacesContext.getCurrentInstance().getViewRoot().createUniqueId();

コンポーネントを動的に JSF ツリーに追加するには、以下のコード スニペットを参照してください。

HtmlPanelGrid panelGrid=new HtmlPanelGrid();
panelGrid.setColumns(2);
String uniqueId=FacesContext.getCurrentInstance().getViewRoot().createUniqueId();
panelGrid.setId(uniqueId);    arrLstComponentIds.add(uniqueId);
HtmlInputText inputText = new HtmlInputText();    
HtmlOutputLabel outputLabel=new HtmlOutputLabel();
                                          panelGrid.getChildren().add(outputLabel);
panelGrid.getChildren().add(inputText);
htmlGridElement = new HtmlPanelGrid();      htmlGridElement.getChildren().add(panelGrid); 

JSF ツリーの変更が反映されるように、パネルを再レンダリングする必要があります。

于 2012-06-23T08:18:31.857 に答える