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

这种方法有两个问题:

  1. change事件是监听单选按钮和复选框更改的错误事件。你需要click。否则,第一次点击不会触发某个浏览器中的操作,该浏览器由位于雷德蒙德的团队开发。更好的是,完全省略该event属性。它已经默认为正确的。

  2. 您不能让 JS/Ajax 更新最初不是由 JSF 呈现的内容,因此在 HTML DOM 树中完全不存在。您需要将条件渲染的 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 回答