在我们的应用程序中,我们动态显示菜单。我们用所有菜单项(从xml读取)填充了菜单对象(下面代码中的菜单项)。主页然后通过使用ui:repeat生成菜单。英迪ui:重复有p:commandlink。以下是代码
<h:form id="mainMenu">
<h:panelGroup id="MMPanel" layout="block" styleClass="left_menu">
<ui:repeat var="node" value="#{menuitems.level1menus}">
<p:commandLink immediate="true" styleClass="menu"
action="#{menuitems.onLevel1MenuChange(node.id)}"
update=":pageTitle :menuLevel2 :menuLevel3" title="#{node.name}"
rendered="#{menuitems.selectedLevel1.id!=node.id}" onclick="menuSelect(this)">
<span class="icon icon_#{node.name}"></span>
<span class="text">#{node.name}</span>
</p:commandLink>
<p:commandLink immediate="true" styleClass="menu activelink"
action="#{menuitems.onLevel1MenuChange(node.id)}"
update=":pageTitle :menuLevel2 :menuLevel3" title="#{node.name}"
rendered="#{menuitems.selectedLevel1.id==node.id}" onclick="menuSelect(this)">
<span class="icon icon_#{node.name}"></span>
<span class="text">#{node.name}</span>
</p:commandLink>
</ui:repeat>
</h:panelGroup>
</h:form>
menuitems bean处于会话级别。ui中有两个不同的p:commandlink:repeat。2之间的唯一区别在于styleclass和rendered属性。这样做是为了在用户第一次登录时识别默认菜单项,并为其提供额外的css"activeLink"。下面给出了在onclick上调用的java脚本(如果需要的话)
function menuSelect(selectOne){
$(".left_menu>a").removeClass("activelink");
$(selectOne).addClass("activelink");
removeAllChannels();
}
function removeAllChannels(){
$.atmosphere.unsubscribe();
}
removeAllChannels是删除我们拥有的primepush自动刷新通道。
我面临的问题是这样的。所有链接都得到了正确的渲染,在Firebug中,我看到所有链接都有相同的html。但是,使用额外的css"activeLink"(通过呈现条件--menuitems.selectedLevel1.id=node.id)生成的css不起作用。单击此默认链接时不会发生任何事情。所有其他链接工作正常。因此,当我点击另一个链接时,它会将我带到所需的页面。但当我点击默认菜单时,什么也没发生我添加了一个Custom阶段侦听器,看到当单击此链接时,所有的生命周期阶段都会被调用,但操作方法没有。我浏览了这个和这个的链接,但无法找出问题所在。请帮忙。如果不清楚,请告诉我
作为防止被篡改/黑客入侵请求的一部分,JSF组件的rendered
属性在处理表单提交过程中会被重新评估。在命令链接/按钮的情况下,如果它评估false
,那么它的操作将不会排队/调用。这与您看到的症状相匹配。
如果托管bean#{menuitems}
是请求范围的,和/或在回发请求期间#{menuitems.level1menus}
或#{menuitems.selectedLevel1}
后面的属性发生了不兼容的更改,则可能会发生这种情况。
将bean放在视图范围中并确保getter不做任何业务工作应该可以解决这个问题。
另请参阅:
- 如何选择正确的bean范围
- commandButton/commandLink/ajax-action/listaner方法未调用或输入值未更新-第5点适用于您