在我的.xhtml
页面中选择一个单选选项后,它将调用我的backing 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:菜单不呈现。开始
这种方法有两个问题:
-
change
事件是在单选按钮和复选框更改时侦听的错误事件。你需要click
代替。否则,第一次点击将不会触发位于雷德蒙德的团队开发的某个浏览器中的操作。更好的做法是完全省略event
属性。 -
你不能让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>
参见:
- 什么值我可以传递给事件属性的f:ajax标签?
- 为什么我需要在组件中嵌套render ="#{some}"在另一个组件,当我想ajax更新它?