【问题标题】:p:commandlink inside ui:repeatp:commandlink 里面的 ui:repeat
【发布时间】:2012-11-29 19:58:54
【问题描述】:

在我们的应用程序中,我们动态显示菜单。我们的菜单对象(下面代码中的菜单项)填充了所有菜单项(从 xml 读取)。然后主页通过使用 ui:repeat 生成菜单。 Insdie ui:repeat 还有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。两者之间的唯一区别在于样式类和渲染属性。这样做是为了在用户第一次登录时识别 default 菜单项,并为其提供额外的“activeLink”css。 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)生成的那个不起作用。当我单击此 default 链接时,没有任何反应。所有其他链接工作正常。 因此,当我单击不同的链接时,它会将我带到所需的页面。但是当我点击默认菜单时,什么也没有发生 我添加了一个自定义阶段侦听器,并看到单击此链接时调用了所有生命周期阶段,但操作方法没有。 我浏览了链接thisthis,但无法找出问题所在。 请帮忙。 如果有不清楚的地方请告诉我

【问题讨论】:

    标签: jsf-2 primefaces commandlink uirepeat


    【解决方案1】:

    作为防止篡改/黑客请求的一部分,JSF 组件的rendered 属性在处理表单提交期间被重新评估。在命令链接/按钮的情况下,如果它评估 false,那么它的操作将不会被排队/调用。这与您看到的症状相符。

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

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

    另见:

    【讨论】:

    • 确实是这个问题。谢谢@BalusC。我将不得不寻找替代方案
    猜你喜欢
    • 2012-05-22
    • 2012-07-16
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多