ui:repeat是否需要唯一的var名称?

时间:2012-09-11 15:01:48

标签: jsf-2 facelets mojarra uirepeat

首先,让我解释一下结构。我有一些JSF Facelets页面,它们使用模板提供动态生成菜单的公共标题。在该模板中,使用以下代码生成菜单:

<ui:repeat var="item" value="#{mainMenuBackingBean.subMenuItemsList}">
                        <td class="#{item.cssClass}">
                            <h:outputLink id="submenu_#{item.nameText}" value="#{item.linkPath}" disabled="#{item.disabled}">
                                #{item.nameText}
                            </h:outputLink>
                        </td>
                    </ui:repeat>

每个页面都有一个页面支持bean,它知道如何设置菜单,因此在页面呈现之前,菜单是使用以下代码设置的:

<f:event listener="#{specificPageBackingBeanHere.setup}" type="preRenderView"></f:event>

在抽象类中调用所有特定页面支持bean扩展的setup方法,然后进行一些调用以将正确的元素添加到mainMenueBackingBean的菜单列表中。到目前为止,这对我们来说已经完美无缺,到目前为止我们没有任何问题。

在新页面上,我们有一个动态布局的表格,使用以下代码实现:

<table class="gridall">
        <tr>
            <td colspan="4" style="text-align: center;"><b>Table Title</td>
        </tr>
        <tr>
            ...
            column headings here
            ...
        </tr>
        <ui:repeat var="item" value="#{outgoingFaxBacking.outgoingList}">
            <tr bgcolor="#{item.status.color}">
                <td style="text-align: center;" class="itemsTopCell">
                    <h:commandLink value="#{item.itemNo}" action="#{outgoingFaxBacking.testMe}" > 
                        <f:ajax render=":rightColumn"/>
                    </h:commandLink>
                    <br/>
                    <b>Last: #{item.lastString}</b>
                </td>
                <td class="itemsTopCell">
                    #{item.description}
                </td>
                <td style="text-align: center" class="itemsTopCell">
                    <h:outputText value="#{item.quantity}">
                        <f:convertNumber maxFractionDigits="2"/>
                    </h:outputText>
                </td>
                <td style="text-align: center;" class="itemsTopCell">
                    <h:inputHidden id="notFilledNote" value="#{outgoingFaxBacking.notFilledNote}"/>
                    <h:commandButton  action="#{outgoingFaxBacking.markNotFilled(item.id)}" onclick="return(notFilled());" value="Not Filled">
                        <f:ajax execute="notFilledNote" render="@form"/>
                    </h:commandButton>
                </td>
            </tr>
            <tr bgcolor="#{item.status.color}">
                <h:panelGroup rendered="#{empty item.note}">
                    <td style="border-top: 1px;" colspan="4">
                        #{item.sig}
                    </td>
                </h:panelGroup>
                <h:panelGroup rendered="#{not empty item.note}">
                    <td style="border-top: 1px; border-bottom:0px;" colspan="4">
                        #{item.sig}
                    </td>
                </h:panelGroup>     
            </tr>
            <h:panelGroup rendered="#{not empty item.note}">
                <tr bgcolor="#{item.status.color}">
                    <td colspan="4" style="border-top: 1px;">
                        #{item.note}
                    </td>
                </tr>
            </h:panelGroup>
            <tr>
                <td style="border: 0px;font-size:2%" colspan="3">
                 &nbsp;
                </td>
            </tr>
        </ui:repeat>
    </table>

页面第一次完美渲染。问题是当你单击表中的commandLink或commandButton时(并且只有这个表,页面上没有其他命令元素导致这个),会产生一个错误,如下所示:

  

serverError:class javax.faces.view.facelets.TagAttributeException /WEB-INF/templates/secure.xhtml @ 130,106 id =“submenu _#item.nameText}”:在org.ppa类型上找不到属性'nameText' .db.serializabledb.FaxItemsContainer

错误位置(@ 130,106)是我上面引用的菜单代码,但正在查看的对象类型(FaxItemsContainer)在上面的动态表中使用,而不是菜单。稍微摆弄一下,并确保它不是ajax问题,或ui:include问题,或其他任何东西,我们最终将表中的var名称从“item”更改为“faxItem”,它出现了工作。

所以最终,我的问题是我认为ui:repeat(和其他JSF组件)的var名称在范围内是本地的,因此在同一页面上的两个ui:重复使用相同的var应该无关紧要名称;情况并非如此吗?请问:同一页面上的重复标签真的需要唯一的var名称吗?

我在Tomcat 7上运行Mojarra 2.1.3。

0 个答案:

没有答案