0

ページでラジオ オプションを選択する.xhtmlと、バッキング Bean メソッドが呼び出され、DB からの値を使用してメニュー項目が動的に作成され、.xhtmlページがレンダリングされます。

<p:selectOneRadio id="userRadio" value="#{applicationBean.selectedUser}" >
    <f:selectItems value="#{applicationBean.usernames1}" />
    <p:ajax event="change" listener="#{applicationBean.displayCommands}" update="commandmenu" />
</p:selectOneRadio>

<p:menu model="#{applicationBean.model}" id="commandmenu" rendered="#{applicationBean.menudisplay}"/>

バッキングビーン法

public void displayCommands(AjaxBehaviorEvent event)
{
 System.out.println("The selected user is... "+selectedUser);

 Map<String, String> commands =userCommand.get(selectedUser);

 if(commands!=null)
 {
      System.out.println("the number of commands are.."+commands.size());
      for (Map.Entry<String,String> entry : commands.entrySet())
      {
         System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
      }

 }
 this.menudisplay = true;
 FacesContext.getCurrentInstance().renderResponse();     
}

p:menu はレンダリングされません。最初は

4

1 に答える 1

1

このアプローチには2つの問題があります。

  1. changeイベントは、ラジオボタンとチェックボックスの変更をリッスンするのに間違ったイベントです。click代わりに必要です。そうしないと、最初のクリックで、レドモンドにあるチームによって開発された特定のブラウザーでアクションがトリガーされません。eventさらに良いことに、属性を完全に省略してください。デフォルトではすでに正しいものになっています。

  2. JS / Ajaxに、最初はJSFによってレンダリングされなかったため、HTMLDOMツリーに完全に存在しないコンテンツのコンテンツを更新させることはできません。条件付きでレンダリングされたJSFコンポーネントを別のJSFコンポーネント内にラップする必要があります。このコンポーネントは常にレンダリングされ、HTML DOMツリーに常に存在するdocument.getElementById()ため、通常の方法などでJS/Ajaxで常に使用できます。

簡単に言うと、これが解決策です(event属性が削除さ<p:menu>れ、パネルグループに配置されます)。

<p:selectOneRadio id="userRadio" value="#{applicationBean.selectedUser}" >
    <f:selectItems value="#{applicationBean.usernames1}" />
    <p:ajax listener="#{applicationBean.displayCommands}" update="commandmenu" />
</p:selectOneRadio>

<h:panelGroup id="commandmenu">
    <p:menu model="#{applicationBean.model}" rendered="#{applicationBean.menudisplay}"/>
</h:panelGroup>

参照:

于 2013-03-14T21:01:34.303 に答える