p:ulink中的commandlink:重复

时间:2012-12-12 06:44:43

标签: jsf-2 primefaces commandlink uirepeat

在我们的应用程序中,我们正在动态显示菜单。我们有菜单对象(下面的代码中的menuitems)填充了所有菜单项(从xml中读取)。然后主页通过ui:repeat生成菜单。 Insdie 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:repeat中有两个不同的p:commandlink。 2之间的唯一区别在于styleclass和rendered属性。这样做是为了在用户第一次登录时识别默认菜单项,并为其提供额外的“activeLink”css。 下面给出了onclick上调用的java脚本(如果需要的话)

    function menuSelect(selectOne){
        $(".left_menu>a").removeClass("activelink");
        $(selectOne).addClass("activelink");
        removeAllChannels();
    }
    function removeAllChannels(){
            $.atmosphere.unsubscribe();
      }

removeAllChannels将删除我们拥有的primepush autorefresh频道。

我面临的问题是这个。 所有链接都正确呈现,在Firebug中,我看到所有链接都具有相同的html。 但是使用额外的css“activeLink”(通过渲染条件 - menuitems.selectedLevel1.id == node.id)生成的那个不起作用。点击此默认链接后,没有任何反应。所有其他链接工作正常。 因此,当我点击其他链接时,它会将我带到所需的页面。但当我点击默认菜单时,没有任何反应 我添加了一个自定义阶段监听器,并且看到在单击此链接时调用了所有生命周期阶段,但操作方法不是。 我浏览了thisthis链接,但无法弄清楚问题。 请帮忙。 如果有什么不清楚,请告诉我

1 个答案:

答案 0 :(得分:1)

作为防范篡改/被黑客入侵请求的一部分,在处理表单提交期间会重新评估JSF组件的rendered属性。如果是命令链接/按钮,如果它评估false,则其行为将不会排队/调用。这符合您所看到的症状。

如果托管bean #{menuitems}是请求作用域和/或在回发请求期间#{menuitems.level1menus}#{menuitems.selectedLevel1}后面的属性不兼容更改,则可能会发生这种情况。

将bean放在视图范围内并确保getter不做任何业务工作应解决这个问题。

另见: