选择selectoneradion后渲染p:菜单

时间:2013-03-14 20:29:18

标签: jsf primefaces

在我的.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}"/>

支持bean方法

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:菜单。 intially

1 个答案:

答案 0 :(得分:1)

这种方法存在两个问题:

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

  2. 您不能让JS / Ajax更新最初未由JSF呈现的内容,因此在HTML DOM树中完全不存在。您需要将有条件呈现的JSF组件包装在另一个始终呈现的JSF组件中,因此始终存在于HTML DOM树中,因此始终可以通过常规document.getElementById()方式使用JS / Ajax等等。

  3. 简而言之,这是解决方案(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>
    

    另见: